1. 程式人生 > >利用反射機制破壞單例(1)

利用反射機制破壞單例(1)

前言

突發奇想,既然單例類通過私有化建構函式來實現單例,而java中通過反射可以獲取類中任意的屬性和方法,那麼可以利用java反射機制獲取單例類的私有建構函式來例項化物件,從而獲取到新的物件。下面用程式碼進行實踐。

程式碼實現

單例類 Singleton :

public class Singleton {
    private static Singleton singleton ;

    private Singleton() {
    }

    public static Singleton getSingleton() {
        if (singleton == null
) { synchronized (Singleton.class) { if (singleton == null) { singleton = new Singleton(); return singleton; } } } return singleton; } }

主函式:

import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;

public
class Main { public static void main(String[] args) throws NoSuchMethodException, IllegalAccessException, InvocationTargetException, InstantiationException { //通過呼叫getSingleton()方式獲取物件 Singleton singleton1 = Singleton.getSingleton(); //通過反射方式獲取物件 Class singleton1Class = singleton1.getClass(); Singleton singleton2 = null
; Constructor<?> constructor = singleton1Class.getDeclaredConstructor();//獲取當前Class所表示類中指定的一個的構造器,和訪問許可權無關 constructor.setAccessible(true); //設定私有方法的可訪問(切記,這裡必須設定,否則會丟擲下圖的異常) singleton2 = (Singleton) constructor.newInstance();//例項化物件 if(singleton1==singleton2){ System.out.println("相等"); }else { System.out.println("不相等"); } } }

輸出:

不相等

利用反射機制破壞單例(2)