反射技術. 由這項技術獲取指定名稱的類,並建立該類的對象。 提高了程序的擴展性。
反射技術:動態的獲取類以及類中的成員,並可以調用該類成員,
以前 是有什麼類,就new 什麼類, 現在是,沒有類,給什麼類就new什麼對象
無論new 什麼對象,都需要先獲取字節碼文件。
如何獲取呢? 發現java已對字節碼文件進行了描述用的class類完成的
如何獲取一個字節碼文件的對象?
方式一: Object getClass(); 方法。 不適合,因爲 反射技術不明確具體類
方式二: 所有的數據類型都有自己對應的Class對象,表示方式很簡單。
每一個數據類型都有一個默認的靜態的屬性。 .Class,用該屬性就可以獲取到字節碼文件對象。
方式三: 在class類中的找到了forName方法。通過名稱就可以獲取對應的字節碼文件對象。
獲取指定的age字段。
String className ="cn.itcast.domain.Person";
Class clazz = Class.forName(className);
Object obj = clazz.getField("age");// 該方法只獲取公有的
Field field = clazz.getDeclaredField("age");// 全部獲取
要對非靜態的字段操作必須有對象。
Object obj = clazz.newInstance();
//使用父類的方法將訪問權限檢查能力取消
field.setAccessible(true); // 暴力訪問
field.set(obj,40);
System.out.println(field.get(obj));
動態獲取方法:
// 反射方法,非靜態,有參數的paramShow方法。
Method method = clazz.getMethod("paramShow",String.class,int.class);
Object obj = clazz.newInstance();
method.invoke(obj,"xiaoqiang",40);
// 反射方法,靜態,無參數的staticShow方法
Method method = clazz.getMethod("staticShow",null);
method.invoke(null,null);