通过私有构造方法创建对象
2009-12-31 09:40
495 查看
写一个单例模式:
这个Singleton类是一个单实例模型,它的构造方法是private修饰的,外部类没有办法通过new来创建它的实例,只能通过调用它的静态方法getIntance来获得实例,并且在多处调用都返回一个实例,再也不创建多余的实例。
我们的客户端如下:
打印结果如下:
但是我们怎样通过private的构造方法创建一个实例呢,答案是反射。
反射式java里重要的一个模块,了解反射可以为我们做很多工作。反射的基本原理就是将一个类的字节码映射成一个可以描述这个类的各种信息的Class对象。
下面我们会在客户端加上一些代码:
打印结果为:
我们看到了,两次创建的对象是不同的,我们确实通过私有的构造方法创建了一个Singleton类的实例。
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 = new Singleton();这是行不通的
打印结果如下:
test.reflect.Singleton@c17164
但是我们怎样通过private的构造方法创建一个实例呢,答案是反射。
反射式java里重要的一个模块,了解反射可以为我们做很多工作。反射的基本原理就是将一个类的字节码映射成一个可以描述这个类的各种信息的Class对象。
下面我们会在客户端加上一些代码:
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);
打印结果为:
test.reflect.Singleton@c17164 test.reflect.Singleton@1fb8ee3 false
我们看到了,两次创建的对象是不同的,我们确实通过私有的构造方法创建了一个Singleton类的实例。
相关文章推荐
- 通过私有构造方法创建对象(转)
- 通过反射可以获取Class的构造方法 通过构造方法创建对象
- java 将构造方法变为私有的,为什么其他类不能创建该类的对象?
- 通过反射创建私有化类的对象,调用类的私有方法,改变私有属性
- 通过反射机制创建一个构造方法中参数数量可变的对象
- Java 反射创建类的实例对象(默认构造方法和私有构造方法)
- 4. 【创建和销毁对象】通过私有化构造方法强化不可实例化的能力
- javascript——构造方法创建对象
- Spring开发之静态工厂创建对象+动态工厂创建对象+构造方法创建对象+set方法注入+构造方法注入
- 工厂模式解决如何不通过new来创建实例对象的方法
- 创建对象的方法(构造模式)
- php实例化一个对象时通过构造方法传参
- main函数中通过使用Person类和AddressBook类,创建对象、调用方法,实现以下8个功能
- C# 反射-通过继承接口实现创建对象并调用方法
- (44)通过继承创建线程对象的例子+getName+setName+currentThread()方法应用介绍
- 通过构造方法或者工厂方法创建实例的区别
- js(十五)——工厂和构造方法创建对象
- Android(java)学习笔记108:通过反射获取私有构造方法并且使用
- Spring 创建对象的问题,不同构造方法创建对象,使用工厂类类获取对象、单例或多例、延迟创建问题
- 第3条:通过私有构造方法强化不可实例化的能力