概念介紹
Java反射機制
JAVA反射機制是在運行狀態(tài)中,對于任意一個類寄悯,都能夠知道這個類的所有屬性和方法热某;對于任意一個對象昔馋,都能夠調用它的任意一個方法和屬性糖耸;這種動態(tài)獲取的信息以及動態(tài)調用對象的方法的功能稱為java語言的反射機制嘉竟。
Class類
- 在Java語言中,靜態(tài)的成員倦蚪、普通數(shù)據(jù)類型不是對象边苹。類是對象陵且,類是java.lang.Class類的實例對象
- 如何表示?
Class c1 = Foo.class;
Class c2 = foo1.getClass(); //foo1是Foo類的實例對象
Class c3 = Class.forName("com.niaoge2016.Foo");
// 可以通過Class創(chuàng)建該類的實例對象
Foo foo1 = (Foo)c1.newInstance(); - 基本的數(shù)據(jù)類型
void等關鍵字慕购,都存在Class(類類型)
動態(tài)加載類
編譯時刻加載類是靜態(tài)加載類,運行時刻加載類是動態(tài)加載類茬底。
- new創(chuàng)建對象是靜態(tài)加載類,在編譯時刻就需要加載所有可能用到的類阱表。
- 上面的Class.forName("類的全稱")不僅表示類的類類型殿如,還代表了動態(tài)加載類最爬,只有在運行時刻用到該類時才進行加載涉馁。
功能總結
Class類的基本API
Class類常用方法
Class c = obj.getClass();
獲取類的名稱
c.getName();獲取方法
// 獲取此Class對象表示的類或接口中指定的公共成員方法
Method m1 = c.getMethod(String name,Object ...);
// 獲取所有的public函數(shù),包括父類繼承來的
Method[] ms1 = c.getMethods();
// 獲取此Class對象表示的類或接口中指定的已聲明方法
Method m2 = c.getDeclaredMethod(String name,Object ...);
// 獲取所有該類自己聲明的方法烂叔,不問訪問權限(公共谨胞,保護蒜鸡,包胯努,私有)叶沛,不包括從父類繼承的方法
Method[] ms2 = c.getDeclaredMethods();
- 獲取成員變量
// 獲取此Class對象表示的類或接口中指定的公共成員變量
Field f1 = c.getField(String name);
// 獲取所有的public成員變量信息灰署,包括父類繼承來的
Field[] fs1 = c.getFields();
// 獲取此Class對象表示的類或接口中指定的已聲明成員變量
Field f2 = c.getDeclaredField(String name);
// 獲取所有該類自己聲明的成員變量信息溉箕,不問訪問權限(公共晦墙,保護,包寡痰,私有)抗楔,不包括從父類繼承的成員變量信息
Field[] fs2 = c.getDeclaredFields();
- 獲取類的構造器
// 獲取此Class對象表示的類中指定的類構造方法
Constructor c1 = c.getConstructor(Class<?> ...);
// 獲取此Class對象表示的類中所有公共的類構造方法
Constructor[] cs1 = c.getConstructors();
// 獲取此Class對象表示的類或接口中指定的類構造方法
Constructor c2 = c.getDeclaredConstructor(Class<?> ...);
// 獲取此Class對象表示的類的所有類構造方法,不問訪問權限(公共拦坠,保護连躏,包,私有)贞滨,不包括從父類繼承的類構造方法
Constructor[] cs2 = c.getDeclaredConstructors();
- 新建類的實例
// 調用類的Class對象的newInstance()方法
Object inst = c.newInstance();
// 調用默認Constructor對象的newInstance()方法
Constructor c3 = c.getConstructor();
Object inst = c3.newInstance();
// 調用帶參數(shù)的Constructor對象的newInstance()方法
Constructor c4 = c.getDeclaredConstructor(int.class,String.class);
Object inst = c4.newInstance(1,"abc");
方法反射的基本操作
- 如何獲取某個方法
方法的名稱和方法的參數(shù)列表才能唯一確定某個方法 - 方法反射的操作
m1.invoke(對象入热,可變參數(shù)列表)
參數(shù)列表根據(jù)實際情況,可以傳數(shù)組Object[]疲迂,也可以傳具體參數(shù)列表才顿,如:
m1.invoke(a1,new Object[]{10,20}); 或者
m1.invoke(a1,10,20);