国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

通過私有構造方法創建對象

2019-11-17 03:54:00
字體:
來源:轉載
供稿:網友
如果你看到標題就已經知道我要寫什么內容了,看來你的功力還在我之上;如果你一頭霧水,那仔細往下看就對了。

我先寫一個單例模式:

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
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 宣威市| 天长市| 汉川市| 道孚县| 哈尔滨市| 襄垣县| 宁强县| 湘阴县| 平凉市| 莒南县| 虞城县| 双柏县| 玛曲县| 犍为县| 封丘县| 龙门县| 沙河市| 都安| 资阳市| 隆安县| 鄂托克前旗| 衡阳县| 通榆县| 浪卡子县| 株洲县| 启东市| 轮台县| 班玛县| 平乡县| 凤台县| 泸西县| 延川县| 新巴尔虎左旗| 海宁市| 邛崃市| 延津县| 苍梧县| 万安县| 萨嘎县| 大理市| 长宁区|