在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