- 反射:
將類的各個組成部分封裝為其他物件,這就是反射機制 - 獲取Class物件的方式:
1. Class.forName("全類名"):將位元組碼檔案載入進記憶體,返回Class物件 * 多用於配置檔案,將類名定義在配置檔案中。讀取檔案,載入類 2. 類名.class:通過類名的屬性class獲取 * 多用於引數的傳遞 3. 物件.getClass():getClass()方法在Object類中定義著。 * 多用於物件的獲取位元組碼的方式 * 結論: 同一個位元組碼檔案(*.class)在一次程式執行過程中,只會被載入一次,不論通過哪一種方式獲取的Class物件都是同一個。
- 獲取Class物件的方式:
- Class 物件功能:
獲取功能 - 獲取成員變數們
* Field[] getFields() :獲取所有public修飾的成員變數 * Field getField(String name) 獲取指定名稱的 public修飾的成員變數 * Field[] getDeclaredFields() 獲取所有的成員變數,不考慮修飾符 * Field getDeclaredField(String name)
- 獲取構造方法們
* Constructor<?>[] getConstructors() * Constructor<T> getConstructor(類<?>... parameterTypes) * Constructor<T> getDeclaredConstructor(類<?>... parameterTypes) * Constructor<?>[] getDeclaredConstructors()
- 獲取成員方法們:
* Method[] getMethods() * Method getMethod(String name, 類<?>... parameterTypes) * Method[] getDeclaredMethods() * Method getDeclaredMethod(String name, 類<?>... parameterTypes)
- 獲取全類名
* String getName()
Constructor:構造方法
* 建立物件: * T newInstance(Object... initargs) * 如果使用空引數構造方法建立物件,操作可以簡化:Class物件的newInstance方法
Method:方法物件
* 執行方法: * Object invoke(Object obj, Object... args) * 獲取方法名稱: * String getName:獲取方法名
需求:寫一個”框架”,不能改變該類的任何程式碼的前提下,可以幫我們建立任意類的物件,並且執行其中任意方法
* 實現: 1. 配置檔案 2. 反射 * 步驟: 1. 將需要建立的物件的全類名和需要執行的方法定義在配置檔案中 2. 在程式中載入讀取配置檔案 3. 使用反射技術來載入類檔案進記憶體 4. 建立物件 建立一個檔案 pro.peoperties 內容如下 className=com.sun.domain.Person methodName=eat
public static void main(String[] args) throws Exception {
//1.1 建立Proterties物件
Properties pro = new Properties();
//1.2 獲取class目錄下的配置檔案
ClassLoader cld = ReflectTest.class.getClassLoader();
InputStream io = cld.getResourceAsStream("pro.properties");
pro.load(io);
//2. 獲取配置檔案中的內容
String className = pro.getProperty("className");
String mothodName = pro.getProperty("methodName");
//3. 載入該類記憶體
Class cls = Class.forName(className);
//4.建立類物件
Object obj = cls.newInstance();
//5.獲取方法物件
Method method = cls.getMethod(mothodName,String.class);
//執行方法
method.invoke(obj,"food...");
}
本作品採用《CC 協議》,轉載必須註明作者和本文連結