反射原理及案例

sun1584732發表於2021-12-28
  • 反射:
    將類的各個組成部分封裝為其他物件,這就是反射機制
    • 獲取Class物件的方式:
      1. Class.forName("全類名"):將位元組碼檔案載入進記憶體,返回Class物件
      * 多用於配置檔案,將類名定義在配置檔案中。讀取檔案,載入類
      2. 類名.class:通過類名的屬性class獲取
      * 多用於引數的傳遞
      3. 物件.getClass():getClass()方法在Object類中定義著。
      * 多用於物件的獲取位元組碼的方式
      * 結論:
          同一個位元組碼檔案(*.class)在一次程式執行過程中,只會被載入一次,不論通過哪一種方式獲取的Class物件都是同一個。
  1. Class 物件功能:
    獲取功能
  2. 獲取成員變數們
     * Field[] getFields() :獲取所有public修飾的成員變數
     * Field getField(String name)   獲取指定名稱的 public修飾的成員變數
     * Field[] getDeclaredFields()  獲取所有的成員變數,不考慮修飾符
     * Field getDeclaredField(String name)  
  3. 獲取構造方法們
     * Constructor<?>[] getConstructors()  
     * Constructor<T> getConstructor(<?>... parameterTypes)
     * Constructor<T> getDeclaredConstructor(<?>... parameterTypes)  
     * Constructor<?>[] getDeclaredConstructors()  
  4. 獲取成員方法們:
     * Method[] getMethods()  
     * Method getMethod(String name,<?>... parameterTypes)  
     * Method[] getDeclaredMethods()  
     * Method getDeclaredMethod(String name,<?>... parameterTypes)  
  5. 獲取全類名
     * 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 協議》,轉載必須註明作者和本文連結
每天進步一點點

相關文章