前言
反射作為java基礎(chǔ)體系里非常重要的一環(huán),我們在日常的編碼過程中很難觸碰到這一塊飞崖,雖然觸碰比較少但是不代表它就不重要徙瓶。作為java程序員我們有義務(wù)去了解它以及它的常用API山宾。
問題
- 什么是反射
- 為什么要用到反射(反射的作用)
- 反射的使用場景
什么是反射拢蛋?
反射是指程序在運行期間來獲取任意一個類的完整構(gòu)造以及相關(guān)成員變量和方法,并且能夠調(diào)用任意一個對象的任意方法搔预。反射中的反指的就是在運行期間我們才知道需要調(diào)用類是什么并且對它進行操作霹期,與之相對應(yīng)的就是“正”,一般情況下我們需要使用一個類必定知道這個類是什么有什么方法拯田,并對它進行初始化然后對對象進行方法的調(diào)用历造,這就是“正”。
反射就是指到運行期才知道需要操作的類是什么船庇,并且可以在運行期間獲取完整的構(gòu)造以及調(diào)用任意方法
為什么要用到反射(反射的作用)
我們一直在說反射指的是直到運行期間程序才知道要操作什么類以及調(diào)用相關(guān)方法吭产。那么針對一些比方說需要在運行期間來讀取相關(guān)一些配置文件來獲取類名的,你在一開始并不知道他們的名字沒辦法進行 new ClassName()所以需要用到反射鸭轮。
反射的使用場景
- spring/mybatis框架里大量使用了java的反射機制
- 動態(tài)生成對象臣淤,應(yīng)用于工廠模式中。spring的bean容器就是一個大工廠
- jdk的動態(tài)代理實現(xiàn)张弛,就是通過反射來獲取傳入接口的實現(xiàn)類
反射相關(guān)API
java反射里包含了4個相關(guān)的類
- Class類 java里的類的類荒典,在java世界里萬物皆對象,所以類也是一種對象吞鸭,而類就是java.lang.Class的實例化對象。通過它可以獲取到一個類的屬性和方法覆糟。
- Constructor類 處于java.lang.reflec包下刻剥,它表示的是類的構(gòu)造方法,可以用來創(chuàng)建類的實例化對象滩字。
- Filed類 處于java.lang.reflec包下造虏,它表示類的成員變量,可以用來獲取和設(shè)置類的屬性麦箍。
- Method類處于java.lang.reflec包下漓藕,它表示類的方法,可以用來獲取類的方法相關(guān)信息或者執(zhí)行方法挟裂。
獲取Class的方法
//根據(jù)路徑(包名+類名) 來獲取Class方法
Class clazz = Class.forName("com.suxin.myRelfect.Person");
//直接調(diào)用某個類的class屬性來獲取Class
Class clazz2 = Person.class;
//調(diào)用類的對象的getClass方法來獲取Class
Person person = new Person();
Class clazz3 = person.getClass();
獲取Constructor類并且使用它來創(chuàng)建相應(yīng)的對象
//直接通過class類里的newInstance方法享钞,需要Person類里有默認的空構(gòu)造方法
Person p1 = (Person) clazz.newInstance();
//通過class類的getDeclaredConstructor方法,通過參數(shù)類型來指定某個構(gòu)造方法并進行生成對象
Constructor<Person> constructor = clazz.getDeclaredConstructor(String.class,Integer.class);
Person p2 = constructor.newInstance("老夫",10);
獲取Filed類和Method類
//獲取類的所有成員屬性
Field[] fields = clazz.getDeclaredFields();
for(Field field: fields) {
System.out.println(field.toString());
}
//獲取類的所有方法
Method[] methods = clazz.getDeclaredMethods();
for(Method method : methods) {
System.out.println(method.toString());
}
getDeclaredMethods與getMethods诀蓉,getDeclaredFields與getFields栗竖,getDeclaredConstructors與getConstructors的不同區(qū)別
- 最關(guān)鍵的區(qū)別就是前者可以獲取到類的無論成員變量還是方法無關(guān)乎它是不是public訪問權(quán)限的都可以獲取到暑脆,而后者只能獲取到被public訪問權(quán)限申明的變量或者方法。