利用反射機制破壞單例(1)
阿新 • • 發佈:2018-11-20
前言
突發奇想,既然單例類通過私有化建構函式來實現單例,而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("不相等");
}
}
}
輸出:
不相等