java反射使用總結

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();//返回全類名
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章