通过私有构造方法创建对象

写一个单例模式:

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();这是行不通的
打印结果如下:

test.reflect.Singleton@c17164

但是我们怎样通过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);
打印结果为:

test.reflect.Singleton@c17164
test.reflect.Singleton@1fb8ee3
false

我们看到了,两次创建的对象是不同的,我们确实通过私有的构造方法创建了一个Singleton类的实例。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值