Java學習(7) -- 反射

一、 什麼是反射

           Java反射說的是在運行狀態中,對於任何一個類,我們都能夠知道這個類有哪些方法和屬性對於任何一個對象,我們都能夠對它的方法和屬性進行調用。我們把這種動態獲取對象信息和調用對象方法的功能稱之爲反射機制。

 

二、反射與工廠模式 

工廠模式一般有兩類,一類是工廠方法模式,另一類是抽象工廠模式。但是《head first 設計模式》中,通過某些例子,實際上把工廠模式分爲三種:

  • 簡單工廠模式(Simple Factory)
  • 工廠方法模式(Factory Method)
  • 抽象工廠模式(Abstract Factory)

可以通過反射,在工廠類里根據配置文件獲得要創建的對象

public static INormalMessageHandler getNormalMessageHandler() {
        if (normalMessageHandler == null) {
            try {
                //獲取
                defaultNormalHandler = Configuration.getProperty("weixin4j.message.handler.normal", defaultNormalHandler);
                if (Configuration.isDebug()) {
                    System.out.println("微信接受消息處理Hanler:" + defaultNormalHandler);
                }
                // 加載處理器
                Class<?> clazz = Class.forName(defaultNormalHandler);
                try {
                    normalMessageHandler = (INormalMessageHandler) clazz.newInstance();
                } catch (Exception ex) {
                    System.out.println("初始化 INormalMessageHandler 異常:");
                    ex.printStackTrace();
                }
            } catch (ClassNotFoundException ex) {
                System.out.println("找不到: " + defaultNormalHandler + " 類!");
                ex.printStackTrace();
            }
        }
        return normalMessageHandler;
    }

三、反射有什麼作用

1、獲得Class對象

使用Class類的forName靜態方法

直接獲取某一個對象的class

調用某個對象的getClass()方法

2、判斷是否爲某個類的實例

用instanceof關鍵字來判斷是否爲某個類的實例

3、創建實例

使用Class對象的newInstance()方法來創建Class對象對應類的實例。

先通過Class對象獲取指定的Constructor對象,再調用Constructor對象的newInstance()方法來創建實例。

4、獲取方法

getDeclaredMethods()

5、獲取構造器信息

getDeclaredMethods()

getMethods()

getMethod()

6、獲取類的成員變量(字段)信息

getFiled: 訪問公有的成員變量

getDeclaredField:所有已聲明的成員變量。但不能得到其父類的成員變量

getFileds和getDeclaredFields用法

7、調用方法

invoke()

8、利用反射創建數組

Array.newInstance()

四、通過反射獲取Class類

1.調用運行時類本身的.class屬性

Class clazz = String.class;

2,通過運行時類的對象獲取

Person p = new Person();

Class clazz = p.getClass();

3.通過Class的靜態方法獲取:體現反射的動態性

String className = “java.util.commons”;

Class clazz = Class.forName(className);

4.通過類的加載器

String className = “java.util.commons”;

ClassLoader classLoader = this.getClass().getClassLoader();

Class claz = classLoader.loadClass(className);

五、閱讀源碼

java.long.reflect.*

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章