1、反射機制:對一個類進行動態的獲取並創建對象,並調用該類中的內容。
2、應用程序
1.在不明白日後出現什麼樣的實現類時,可以擴展出去,對外提供配置文件,讓後期的實現類都定義在配置文件中。
2.該程序中會讀取配置文件並根據指定的名字找尋具體對應的類。
3.對找到的類進行對象的建立。
4.並調用該類對象的成員。
是不是在動態的獲取指定的類,是!
是不是在調用類中的成員。
這就是反射技術。
3、用於描述字節碼文件的類名稱就是Class
4、只要獲取到字節碼文件對象。就可以獲取該字節碼中所有的內容
這就是動態的獲取類中的內容,並使用
如何獲取到字節碼文件對象呢?
5、反射機制:對一個類進行動態的獲取並創建對象,並調用該類中的內容。
獲取字節碼文件對象的方式。
方式一:對象調用 使用Object類中的getclass方法。
該方式必須先創建未知類的對象,再調用getclass方法。
public static void getClassDemo1() {
Person p1 = new Person();
Person p2 = new Person();
Class clazz1 = p1.getClass();
Class clazz2 = p2.getClass();
System.out.println(clazz1 == clazz2);
}
------------------------------------------------------------------------
方式二:類名調用 使用靜態的class屬性就可以獲取
Class clazz=Person.class;
該方式還是需要使用未知的類。
------------------------------------------------------------------------
方式三:通過Class類中的靜態方法forName(className)完成;
爽!只要通過類名就可以獲取到對應的字節碼文件對象。這種方式的擴展性是最好的。
forName:1.根據傳入的類的名稱,自動去classPath路徑下去尋找與該類名稱相同的類文件。
2.通過加載器將該類進行加載,並在內存中生成該類的字節碼文件對象。
/**
* 方式三:
* @throws ClassNotFoundException
*/
public static void getClassDemo3() throws ClassNotFoundException {
String className = "cn.itcast.bean.Person";// 注意名稱是全名
Class clazz = Class.forName(className);// 放射機制的基本核心
System.out.println(clazz);
}
6、 字段的獲取設置
AccessibleObject 取消權限檢查
public static void getFieldDemo() throws ClassNotFoundException,
NoSuchFieldException, SecurityException, InstantiationException,
IllegalAccessException {
String className = "cn.itcast.bean.Person";
/*
* 獲取指定類中的指定名稱的字段 思路: 1.通過類名獲取字節碼文件對象 2.通過字節碼文件對象獲取其中的成員字段。
*/
// 1.獲取字節碼文件對象
Class clazz = Class.forName(className);
// 2.通過Class對象的方法獲取字段。
// Field field = clazz.getField("age");// 只能獲取公共的字段
Field field = clazz.getDeclaredField("age");
Object obj = clazz.newInstance();
// 取消權限檢查
field.setAccessible(true);// 暴力訪問,不建議此方法訪問
// 對字段進行值得設置,需要使用字段對象來完成
field.set(obj, 30);
System.out.println(field.get(obj));
System.out.println(field);
}
7、 獲取構造器
public static void getConstructorDemo() throws ClassNotFoundException, NoSuchMethodException, SecurityException, InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException {
String className="cn.itcast.bean.Person";
Class clazz=Class.forName(className);
//之前通過newInstance進行指定類的實例化。但是該類中如果沒有空參數構造函數呢?
//或者想通過指定的構造函數進行該類對象實例化呢?
/*
* 1.必須先要獲取指定的構造函數。
* 2.通過獲取到的構造函數對對象進行初始化。
*/
//1.獲取構造器對象
Constructor constructor=clazz.getConstructor(String.class,int.class);
//2.如何初始化,構造器最清楚
Object obj=constructor.newInstance("lisi",20);
}
8、 獲取方法。獲取公有,空參數的方法;
public static void getMethodDemo() throws Exception {
String className = "cn.itcast.bean.Person";
Class clazz = Class.forName(className);
//獲取指定類中的指定的方法
Method method =clazz.getMethod("show", null);
//獲取指定的對象
Object obj=clazz.newInstance();
//調用方法對象的invoke方法。
method.invoke(obj, null);
}
---------------------- android培訓 、 java培訓 、 期待與您交流! ---------------------- 詳細請查看:www.itheima.com