java反射使用總結
獲取類對象
(1)【Source源代碼階段】 Class.forName("全類名"):將字節碼文件加載進內存,返回Class對象
多用於配置文件,將類名定義在配置文件中。讀取文件,加載類。
(2)【Class類對象階段】 類名.class:通過類名的屬性class獲取
多用於參數的傳遞
(3)【Runtime運行時階段】對象.getClass():getClass()方法是定義在Objec類中的方法
多用於對象的獲取字節碼的方式
注意:同一個字節碼文件在一次程序運行過程中,只會被加載一次,無論通過哪一種方式獲取的Class對象都是同一個。
代碼如下所示:
//方法一:Class.forName("全類名")
Class cl1 = Class.forName("cn.buptleida.database.RedisDB");
System.out.println(cl1);
//方法二:類名.class
Class cl2 = RedisDB.class;
System.out.println(cl2);
//方法三:對象.getClass()
RedisDB obj = new RedisDB();
Class cl3 = obj.getClass();
System.out.println(cl3);
成員變量方法
獲取
Class cl = SDS.class;
//根據變量名稱獲取成員變量Field對象,只允許public修飾的變量
Field field = cl.getField("len");
//獲取所有public修飾的成員變量
Field[] fields = cl.getFields();
//根據名稱獲取成員變量,不考慮修飾符
Field declaredField = cl.getDeclaredField("len");
//獲取所有成員變量,不考慮修飾符
Field[] declaredFields = cl.getDeclaredFields();
使用
//需要傳入一個實例化的對象
SDS sds = new SDS(new char[]{'h','e','l','l','o'});
//暴力反射,忽略訪問控制權限
declaredField.setAccessible(true);
//獲取成員變量的值
Object o = declaredField.get(sds);
//設置成員變量的值
declaredField.set(sds,6);
構造方法
獲取
Constructor constructor = cl.getConstructor(char[].class, int.class);
Constructor[] constructors = cl.getConstructors();
Constructor declaredConstructor = cl.getDeclaredConstructor(char[].class, int.class);
Constructor[] declaredConstructors = cl.getDeclaredConstructors();
使用
空參構造方法
//方法一
Constructor constructor = cl.getConstructor();
Object objSds = constructor.newInstance();
//方法二
Object objSds = cl.newInstance();
非空參構造方法
Constructor constructor = cl.getConstructor(char[].class, int.class);
Object objSds = constructor.newInstance(new char[]{'h', 'e', 'l', 'l', 'o'},10);
方法對象
獲取
Method method = cl.getMethod("getBuf");
Method[] methods = cl.getMethods();
//方法如果帶參數,則寫上參數列表
Method declaredMethod = cl.getDeclaredMethod("makeRoom", int.class);
Method[] declaredMethods = cl.getDeclaredMethods();
使用
//需要傳入一個實例化的對象
SDS str = new SDS(new char[]{'h', 'e', 'l', 'l', 'o'});
method.invoke(str);
declaredMethod.setAccessible(true);
declaredMethod.invoke(str,3);
其它
getName方法
String name1 = declaredField.getName();
String name2 = constructor.getName();//返回全類名
String name3 = declaredMethod.getName();
String name4 = cl.getName();//返回全類名