class Single{
// 以下两个方法在使用ObjectInputStream反序列化时若存在则会执行
private void readObject(ObjectInputStream s) {
System.out.println("readObject");
}
// 该方法可防止ObjectInputStream反序列时创建新的实例,反射时弱class存在该方法则执行该方法,否则创建新的实例
private Object readResolve(){
System.out.println("readResolve");
return this;
}
}
class CloneUtil{
public static <T> T clone(T t) {
ByteArrayOutputStream outputStream = null;
ObjectOutputStream objectOutputStream = null;
ByteArrayInputStream inputStream = null;
ObjectInputStream objectInputStream = null;
try {
outputStream = new ByteArrayOutputStream();
objectOutputStream = new ObjectOutputStream(outputStream);
objectOutputStream.writeObject(t);
inputStream = new ByteArrayInputStream(outputStream.toByteArray());
objectInputStream = new ObjectInputStream(inputStream);
return (T)objectInputStream.readObject();
} catch (IOException | ClassNotFoundException e) {
e.printStackTrace();
} finally {
try {
if(outputStream != null) outputStream.close();
if(objectOutputStream != null) objectOutputStream.close();
if(inputStream != null) inputStream.close();
if(objectInputStream != null) objectInputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
return null;
}
}
反射破坏单例模式解决
最新推荐文章于 2023-08-05 20:15:53 发布