单例其实并不是得到的单例类的对象都是同一个对象,下面我通过几个例子给大家演示一下
//单例
public class F extends Exception{
private F(){}
public static final F f=new F();
}
//通过反射的方法创建另外一个单例对象
import java.lang.reflect.Constructor;
public class G {
public static void main(String[] args) throws Exception{
F f= F.f;
Class c= F.class;
Constructor co= c.getDeclaredConstructor(null);
co.setAccessible(true);
F ff= (F) co.newInstance(null);
System.out.println(f==ff); //这里打印false,证明f和ff不是同一个对象
}
}
//利用隐藏的构造器创建另一个单例对象
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
public class H {
public static void main(String[] args) {
F f=F.f;
F ff= (F) copy(f);
System.out.println(f==ff);
}
public static Object copy(Object obj){
try{
ByteArrayOutputStream bos =
new ByteArrayOutputStream();
new ObjectOutputStream(bos).writeObject(obj);
ByteArrayInputStream bin =
new ByteArrayInputStream(bos.toByteArray());
return new ObjectInputStream(bin).readObject();
} catch(Exception e) {
throw new IllegalArgumentException(e);
}
}
//F继承了Exception,而Exception实现了java.io.Serializable。这就意味着F是可序列化的(serializable),并且解序列(deserialization)会创建一个隐藏的构造器
//用这个隐藏的构造器就会创建另外一个单例类F的对象,可以看到打印的结果是false,也就是f和ff不是同一个对象
|
|