1. 程式人生 > >反射之獲取屬性、構造方法、成員方法:

反射之獲取屬性、構造方法、成員方法:

**前戲:**反射都需要用到.class位元組碼檔案,獲得.class位元組碼檔案的方法: 1、物件.getClass(); 2、通過反射得到: 1、類名.class;(開發中少用) 2、Class.forName(“包名.類名”); 1、獲取構造方法: 1、得到所有構造方法(包括公有、私有),返回的是一個數組: 類變數.getDeclaredConstructors(); 2、得到所有公有的構造方法: 類變數.getConstrustors(); 3、得到一個公有的構造方法,並且使其被呼叫: 1、類變數.getConstrustor(); 2、得到一個物件,利用構造方法的變數.newInstance() 3、輸出這個物件即可。 4、得到一個私有的構造方法,並使其被呼叫: 1、類變數.getDeclaredConstructor(int.class);//這裡如果呼叫有參方法就放對應引數即可 2、暴力反射,利用構造方法的變數.setAccessible(true); 3、得到一個物件,利用構造方法的變數.newInstance(12);//引數裡放對應的具體值 4、輸出這個物件即可。 2、獲取屬性:

1、得到所有屬性: 類變數.getDeclaredFeilds(); 2、得到所有公有屬性: 類變數.getFeilds(); 3、得到單個公有的屬性: 1、類變數.getFeild(“name”);//引數放屬性的名字 2、得到物件:類變數.getConstructor().newInstance(); 3、屬性物件.set(obj,"");//第一個是你用反射得到的obj物件,第二個是你要賦的值 4、直接輸出物件;//前提是你的entity類已經重寫toString方法 3、獲取方法: 1、得到所有方法: 類變數.getDeclaredMethods(); 2、得到所有公有的方法: 類變數.getMethods(); 3、得到單個公有的、無參的方法,並呼叫: 1、類變數.geMethod(“方法名”); 2、得到物件,通過類變數.getConstrustor().newInstance(); 3、用方法變數.invoke(物件); 4、呼叫單個私有的、有參的方法,並呼叫: 1、類變數.getMethod(“方法名”,引數型別.class); 2、去掉許可權 方法變數.setAccessible(true); 2、得到物件,類變數.getConstrustor().newInstance(); 3、類變數.invoke(物件,“傳入引數的值”); 4、利用反射忽略泛型的定義:
1、確定泛型是String型別 2、得到list的.class檔案: list.getClass(); 3、得到Method物件: 類變數.geMethod(“add”,Object.class); 4、接著就可以新增int型別的值了。 5、關鍵點: 1、必須使用forEach迴圈輸出,而且型別該為Object。