使用Java反射獲取單例對象

在Java中,在拿到類對象的Class后,就可以通過Java的反射機制來創建類對象的實例對象了,主要分為以下幾種方式:

  • Class.newInstance()
  • 調用類對象的構造方法

但是,如果需要被反射的類是單例呢?若使以上兩種方式,則每次都會重新構造一個不同的實例。
此時我們可以利用Class.getDeclaredMethod直接獲取單例獲取方法,然后invoke就可以了。

單例類

package ewhine.models;

import java.lang.reflect.Method;

public class SingletonReflection {

    private SingletonReflection() {}

    public static SingletonReflection getInstance() {
        return SingletonHolder.instance;
    }

    private static class SingletonHolder {
        public static final SingletonReflection instance = getInstance();
        private static SingletonReflection getInstance() {
            return new SingletonReflection();
        }
    }

    public void say() {
        System.out.println("hello singleton");
    }
}

關鍵是如下代碼

Class c = Class.forName("ewhine.models.SingletonReflection");
Method m = c.getDeclaredMethod("getInstance", null);
SingletonReflection singletonReflection = (SingletonReflection) m.invoke(null, null);

測試

public static void main(String[] args) {
        try {
            Class c = Class.forName("ewhine.models.SingletonReflection");
            Method m = c.getDeclaredMethod("getInstance", null);
            SingletonReflection singletonReflection = (SingletonReflection) m.invoke(null, null);
            
            singletonReflection.say();
            ((SingletonReflection) c.newInstance()).say();

            System.out.println(m.invoke(null) == m.invoke(null, null));
            System.out.println(c.newInstance() == c.newInstance());
        } catch (Throwable t) {
            t.printStackTrace();
        }
    }

輸出

hello singleton
hello singleton
true
false
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容