class Singleton {
private Singleton(){}
private static Singleton instance=new Singleton();
public static Singleton getInstance(){
return instance;
}
}
Singleton s1=Singleton.getInstance()
Singleton s2=Singleton.getInstance()
System.out.println(s1)
System.out.println(s2)
输出:
sf3.Singleton@1db9742
sf3.Singleton@1db9742
使用反射破解单例:
Class<Singleton> clazz=(Class<Singleton>)
Class.forName("sf3.Singleton")
Constructor<Singleton> c=clazz.getDeclaredConstructor(null)
c.setAccessible(true)
Singleton ss1=c.newInstance()
System.out.println(ss1)
输出:
sf3.Singleton@106d69c
解决反射破坏单例:
private Singleton(){
if(instance!=null){
throw new RuntimeException();
}
}
序列化破解:
class Singleton implements Serializable{
private Singleton(){}
private static Singleton instance=new Singleton();
public static Singleton getInstance(){
return instance;
}
}
FileOutputStream fos=new FileOutputStream("d:/a.txt")
ObjectOutputStream oos=new ObjectOutputStream(fos)
oos.writeObject(s1)
oos.close()
fos.close()
ObjectInputStream ois=
new ObjectInputStream(new FileInputStream("d:/a.txt"))
Singleton s3=(Singleton) ois.readObject()
System.out.println(s3)
输出:
sf3.Singleton@873330
解决序列化破解反射:
class Singleton implements Serializable{
private Singleton(){}
private static Singleton instance=new Singleton();
public static Singleton getInstance(){
return instance;
}
private Object readResolve(){
return instance;
}
}