Java反射機制總結
首先咱們要知道什麽是類對象:類對象就是記錄某個類本身的構造方法、屬性、方法的對象。
1. 獲取類對象的三種方式
Class.forName(‘完整類名‘)
類名.class
new 類名().getClass()
示例:用反射來創建一個新的對象。
package reflection; import java.lang.reflect.Constructor; import dealreflect.Hero; public class TestReflection { public static void main(String[] args) {try { //使用反射的方式創建對象 String className = "dealreflect.Hero"; //類對象 Class pClass=Class.forName(className); //構造器 Constructor c= pClass.getConstructor(); //通過構造器實例化 Hero h2= (Hero) c.newInstance(); h2.name="gareen"; System.out.println(h2); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } }
2. 反射類裏面的方法
1.加載類 Class clazz = Class.forname("完整類名")
2.加載方法 Method method = clazz.getMethod("方法名",String.class,int.class(參數類型))
3.運行方法 method.invoke(類的實例,傳參)
註意這兒得傳類的實例,類對象是不行的。
反射main()方法
1.加載類 Class clazz = Class.forname("完整類名")
2.加載方法 Method method = clazz.getMethod("main",String[] args);
3.運行方法,比較奇怪 method.invoke(null,new Object[](new String[]{"aa","bb"})) 或者 method.invoke(null, Object(new String[]{"aa","bb"}))
因為在往主函數裏傳String數組的時候,程序會自己拆分成String a1,String a2
3. 反射類裏面的字段
1.加載類 Class clazz = Class.forname("完整類名")
[clazz.setAccessible(true)] 進行暴力反射,就可以拿到private屬性或方法的值了。
2.加載字段 Field f = clazz.getField("字段名")
備註:getField和getDeclaredField的區別
這兩個方法都是用於獲取字段
getField 只能獲取public的,包括從父類繼承來的字段。
3.獲得字段的值
String name = (Stirng) f.get(p)
或者 Object value = f.get(p)
4.獲取字段的類型
Class type = f.getType();
5.設置字段的值
f.set(p,"xxxxxxxx")
Java反射機制總結