通過私有構造方法建立物件
寫一個單例模式:
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來獲得例項,並且在多處呼叫都返回一個例項,再也不建立多餘的例項。
我們的客戶端如下:
Singleton singleton = Singleton.getInstance();
System.out.println(singleton);
//Singleton singleton = new Singleton();這是行不通的
列印結果如下:
但是我們怎樣通過private的構造方法建立一個例項呢,答案是反射。
反射式java裡重要的一個模組,瞭解反射可以為我們做很多工作。反射的基本原理就是將一個類的位元組碼對映成一個可以描述這個類的各種資訊的Class物件。
下面我們會在客戶端加上一些程式碼:
列印結果為:Singleton singleton = Singleton.getInstance(); System.out.println(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);
[email protected]
[email protected]
false
我們看到了,兩次建立的物件是不同的,我們確實通過私有的構造方法建立了一個Singleton類的例項。
相關推薦
通過私有構造方法建立物件
寫一個單例模式: package test.reflect; public class Singleton { private static Singleton s= null; private Singleton() { } public stati
反射帶參與無參構造方法建立物件
public static void main(String[] args) throws NoSuchMethodException, SecurityException, InstantiationException, IllegalAccessException, Il
[課本10.1.4]JDBC資料庫連線池- C3P0資料來源--通過構造方法建立資料來源物件--通過配置檔案建立資料來源物件[推薦]
JDBC- C3P0資料來源 1 /*重點提醒*/ 2 連線資料庫的較低的jar包版本會與較高版本的mysql版本有衝突; 3 通過把mysql 8.0的版本降到5.5, jar包仍使用較高的 mysql-connector-java-5.1.7-bin.jar, 完美解決衝突.  
Spring-02 -Spring 建立物件的三種方式 :1.通過構造方法建立/2.例項工廠/3.靜態工廠
通過構造方法建立 1.1 無參構造建立:預設情況. 1.2 有參構造建立:需要明確配置 1.2.1 需要在類中提供有參構造方法 1.2.2 在 applicationContext.x
Java 反射建立類的例項物件(預設構造方法和私有構造方法)
反射之建立類的例項物件 通過反射可以建立Class<?>中”?”對應的型別的例項物件,眾所眾知,建立類物件,會呼叫構造方法,構造器可以有多個,預設構造方法,多引數構造方法等。 這裡演示,通過反射建立預設構造方法的例項物件,和帶引數的構造方法的例項
JAVA—構造方法和物件的建立
一:構造方法和物件的建立 package chapter4.constructor; public class TestConstructor { public static void main(String[] args) {
字串物件構造方法建立和直接賦值的區別
/* * 通過構造方法建立的字串物件和直接賦值方式建立的字串物件有什麼區別呢? * 區別是:通過構造方法建立的字串物件是在堆記憶體。通過賦值建立的字串物件是在方法區的常量池 * * == * 基本資料型別:比較的是基本資料型別的值是否相同 *
js-構造方法和工廠方法建立物件
1.工廠方法建立物件使用工廠方法區別:該方法返回的是object2.構造方法建立物件使用建構函式區別:該方法返回的是createPerson,createDog,this 的情況: 1.當以函式呼叫時,this指的是window。 2.當以方法呼叫時,誰呼叫方法t
Java通過反射機制使用非預設構造器建立物件
1、Class類方法:getConstructors() 在JDK文件中,對於該方法有如下解釋: Returns an array containing Constructor objects re
《Effective Java 中文版 第2版》學習筆記 第4條:通過私有構造器強化不可實例化的能力
缺省 ive ont sof family 其他 筆記 cnblogs ror 只有當類不包含顯式的構造器時,編譯器才會生成一個公有的、無參的缺省構造器。只要讓一個類包含私有構造器,這個類就不能被實例化了。示例: 1 // 工具類 2 public class Uti
private實現封裝處理 &構造方法(匿名物件)
文章目錄 1. private實現封裝處理 2. 構造方法與匿名物件 2.1 構造方法(類中屬性進行初始化) 2.1.1 類中的組成 2.1.2 構造方法的三大特徵 2.1.3 構造方
Spring_(3)通過xml配置bean+建立物件
先來看整體專案的結構 HelloWorld.java package com.spring.beans; public class HelloWorld { private String name; public void setName(String na
通過匿名內部類建立物件
通過匿名內部類的方式建立一個物件,並且完成一些操作。 String [] arr = {"hello", "world", "welcome", "hello world", "welcome h
使用私有構造方法或者列舉型別實現單例
單例(Singleton)是指只例項化一次的類。 單例表示本質上唯一的系統元件,例如檔案系統或者視窗管理器。 package com.googlecode.javatips4u.effectivejava.singleton; publicclass StaticFin
如何通過反射構造內部類物件
嘛。所以我們可以這樣寫:public static void main(String[] args) throws Exception { System.out.println(Class.forName("javalang.Outer$Inner1") .getConstru
通過介面抽象類“建立”物件
前言 首先宣告,用介面或者抽象類例項化一個物件是不可能的,錯誤的。 介面、抽象類實現注意點 Interface 屬性預設都是 public static final 方法預設都是 public abstract 都不用顯示宣告 抽象類 至少
構造器建立物件
構造器是建立物件的重要途徑 問題:構造器是建立Java物件的途徑,是不是說構造器完全負責建立Java物件? 答:不是的。構造器是建立Java物件的重要途徑,通過new關鍵字呼叫構造器時,構造器
第4條:通過私有構造器強化不可例項化的能力
對只有靜態方法和域的類,主要用於把基本型別的值或資料型別上的相關方法組織起來(Math,Arrays),可以通過Collections的方法把實現特定介面的物件上的驚天方法組織起來,可以利用這種類把final類上的方法組織起來,以取代擴充套件該類的做法。此工具類
java之構造方法建立JFrame
package test; import java.awt.*; import javax.swing.*; public class demo extends JFrame{ privat
javascript用工廠方法建立物件
function get() { } function createFactoryObject(login ,pwd) {var object = new Object();object.login = login object.pwd = pwdobject.get =