-
如果你看到標題就已經知道我要寫什麼內容了,看來你的功力還在我之上;如果你一頭霧水,那仔細往下看就對了。
我先寫一個單例模式:
view plaincopy to clipboardprint?
package test.reflect;
public class Singleton {
private static Singleton s= null;
private Singleton() {
}
public static Singleton getInstance() {
if (s == null) {
synchronized (Singleton.class) {
if (s == null) {
s = new Singleton();
}
}
}
return s;
}
}
package test.reflect;
public class Singleton {
private static Singleton s= null;
private Singleton() {
}
public static Singleton getInstance() {
if (s == null) {
synchronized (Singleton.class) {
if (s == null) {
s = new Singleton();
}
}
}
return s;
}
}
這個Singleton類別是一個單一實例模型,它的建構方法是private修飾的,外部類別沒有辦法透過new來建立它的實例,只能透過呼叫它的靜態方法getIntance來獲得實例,並且在多處呼叫都會傳回一個實例,再也不創建多餘的實例。
我們的客戶端如下:
view plaincopy to clipboardprint?
Singleton singleton = Singleton.getInstance();
System.out.println(singleton);
//singleton = new Singleton();這是行不通的
Singleton singleton = Singleton.getInstance();
System.out.println(singleton);
//singleton = new Singleton();這是行不通的
列印結果如下:
view plaincopy to clipboardprint?
test.reflect.Singleton@c17164
test.reflect.Singleton@c17164
但是我們怎麼透過private的建構方法來創建一個實例呢,答案是反射。
反射式java裡重要的一個模組,了解反射可以為我們做很多工作。反射的基本原理就是將一個類別的字節碼映射成一個可以描述這個類別的各種資訊的Class物件。
下面我們會在客戶端加上一些程式碼:
view plaincopy to clipboardprint?
Singleton singleton = Singleton.getInstance();
System.out.println(singleton);
//singleton = new Singleton();這是行不通的
Class<?> clazz = Singleton.class;
//Class<?> clazz = Class.forName("test.reflect.Singleton");//這樣也行
Constructor<?>[] constructors = clazz.getDeclaredConstructors();//取得宣告的建構器
Constructor<?> privateConstructor = constructors[0];//Singleton類別只有一個建構器
privateConstructor.setAccessible(true);//設定accessible為true就可以操作它了
Singleton instance = (Singleton) privateConstructor.newInstance();
System.out.println(instance);
System.out.println(singleton == instance);
Singleton singleton = Singleton.getInstance();
System.out.println(singleton);
//singleton = new Singleton();這是行不通的
Class<?> clazz = Singleton.class;
//Class<?> clazz = Class.forName("test.reflect.Singleton");//這樣也行
Constructor<?>[] constructors = clazz.getDeclaredConstructors();//取得宣告的建構器
Constructor<?> privateConstructor = constructors[0];//Singleton類別只有一個建構器
privateConstructor.setAccessible(true);//設定accessible為true就可以操作它了
Singleton instance = (Singleton) privateConstructor.newInstance();
System.out.println(instance);
System.out.println(singleton == instance);
列印結果為:
view plaincopy to clipboardprint?
test.reflect.Singleton@c17164
test.reflect.Singleton@1fb8ee3
false
test.reflect.Singleton@c17164
test.reflect.Singleton@1fb8ee3
false
我們看到了,兩次創建的物件是不同的,我們確實透過私有的建構方法創建了一個Singleton類別的實例。
本文出自CSDN博客,轉載請標示出處:http: //blog.csdn.net/liuhe688/archive/2009/12/31/5110637.aspx
-