废话不多说,直接上代码。
public class Singleton {
private Singleton() {
}
/**
* 方式1(饿汉模式) 通过反射会得到不同的instance
*/
private static final Singleton instance = new Singleton();
public static Singleton getInstance() {
return instance;
}
/**
* 方式2(懒汉模式) 通过反射会得到不同的instance
*/
private static Singleton instance2 = null;
public synchronized static Singleton getInstance2() {
if (instance2 == null) {
instance2 = new Singleton();
}
return instance2;
}
public enum SingletonEnum {
INSTANCE;
public static SingletonEnum getInstance() {
return INSTANCE;
}
}
测试代码如下:
@Test
public void test() {
Singleton instance=Singleton.getInstance();
try {
//获得Class对象
Class c=Class.forName("com.pyy.Singleton");
//所有定义的Constructors 包括private、protected、public、默认的
Constructor cons[] =c.getDeclaredConstructors();
Constructor con=cons[0];
//可以访问private
con.setAccessible(true);
//通过反射创建Singleton Instance
Singleton instance2=(Singleton)con.newInstance();
//输出false ,说明通过反射可以得到不同的Instance
System.out.println(instance==instance2);
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 通过Enum的方式创建Singleton,可以防止反射创建Singleton Instance
* 下面方法会抛出java.lang.IllegalArgumentException: Cannot reflectively create enum objects
* 的异常。
*/
@Test
public void testEnum() {
SingletonEnum instance=SingletonEnum.getInstance();
try {
Class c=Class.forName("com.pyy.SingletonEnum");
Constructor cons[] =c.getDeclaredConstructors();
Constructor con=cons[0];
con.setAccessible(true);
SingletonEnum instance2=(SingletonEnum)con.newInstance();
System.out.println(instance==instance2);
} catch (Exception e) {
e.printStackTrace();
}
}