要想操作反射,必須先拿到反射的入口
1,通過通過Class.forName("全類名")
try {
Class> perClazz = Class.forName("reflect_fanshe.Person");
System.out.println(perClazz);
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
2,類名.class
Class> perClazz2 = Person.class;
3,對象.getClass()
Person person = new Person();
Class> perClazz3 = person.getClass();
三,根據反射入口對象(class)獲取類的各種信息
可以用一個類的反射入口class對象獲取類的所有信息
例1:perClazz.getMethods() 獲取此類的所有public方法(父類的,實現接口的,自己的)
Class> perClazz = null;
try {
perClazz = Class.forName("reflect_fanshe.Person");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
Method[] methods = perClazz.getMethods();
//遍歷所有方法
for (Method method : methods) {
System.out.println(method);
}
}
例2:獲取所有的構造方法
例3: 獲取父類
例4:獲取當前類(只有本類的)的所有方法和屬性,包括私有的
重要:可以獲取當前類的對象,並通過對象調用類的方法
四,通過反射獲取對象的實例,並操作對象
1,class.newInstance() ,並強轉類型,然後就可以操作對象了,主要是調用方法。
2,操作屬性,可以操作類裡面的public屬性和private屬性
如果屬性是private,正常情況下是不允許外界操作屬性值,這裡可以用Field類的setAccessible(true)方法,暫時打開操作的權限
調用方法也一樣,可以調用私有的方法,null是因為這個方法沒有參數
五,在 程序執行中,動態的決定調用的類,以及方法
在本例中,程序執行之前,程序根本不知道具體的類和方法名是什麼,需要執行時解析properties文件,但是反射就可以辦到。
配置文件:
反射機制:
閱讀更多 網絡好無聊 的文章