反射可以得到单例类的构造器,并将构造器权限修改为true,即允许反射调用private 的构造器,从而使得该类对象不止一个,测试代码
package Singleton;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.OutputStream;
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
public class Test {
public static void main(String[] args) throws FileNotFoundException, IOException, ClassNotFoundException, NoSuchMethodException, SecurityException, InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException {
// Thread t1=new Thread(new T(),"Thread_1");
// Thread t2=new Thread(new T(),"Thread_2");
// t1.start();
// t2.start();
// HungrySingleton instance=HungrySingleton.getInstance();
// ObjectOutputStream oos=new ObjectOutputStream(new FileOutputStream(new File("Test")));
// oos.writeObject(instance);
//
// ObjectInputStream ois=new ObjectInputStream(new FileInputStream("Test"));
// HungrySingleton newInstance=(HungrySingleton) ois.readObject();
// System.out.println(instance==newInstance);
HungrySingleton instance=HungrySingleton.getInstance();
Class objectClass=HungrySingleton.class;
Constructor c=objectClass.getDeclaredConstructor();
c.setAccessible(true);
HungrySingleton newInstance=(HungrySingleton) c.newInstance();
System.out.println(instance);
System.out.println(newInstance);
System.out.println(instance==newInstance);
// TODO Auto-generated method stub
}
}
结果
Singleton.HungrySingleton@7f63425a
Singleton.HungrySingleton@36d64342
false
无论是懒汉式、饿汉式、静态内部类都无法阻止反射破坏单例模式,所以需要特别注意。