企业🤖AI智能体构建引擎,智能编排和调试,一键部署,支持私有化部署方案 广告
演示步骤如下: **1. 单例对象** ```java /** * 实现接口Cloneable、Serializable,让SomeClass类支持克隆和序列化 */ public class SomeClass implements Cloneable, Serializable { private static SomeClass instance; private SomeClass() { } /** * 提供一个公共方法获取自身的实例对象 */ public synchronized static SomeClass getInstance() { if (instance == null) { instance = new SomeClass(); } return instance; } /** * 提供克隆自身对象的方法 */ @Override public SomeClass clone() { try { return (SomeClass) super.clone(); } catch (CloneNotSupportedException e) { e.printStackTrace(); return null; } } } ``` **2. 测试** ```java /** * 先测试一下是否实现了单例 */ @Test public void testSomeClass() { SomeClass someClass1 = SomeClass.getInstance(); SomeClass someClass2 = SomeClass.getInstance(); //输出为true,说明someClass1与someClass2是同一个对象,做到了单例 System.out.println(someClass1 == someClass2); } /** * 克隆方式破坏单例 */ @Test public void cloneDestroySomeClass() { SomeClass sc1 = SomeClass.getInstance(); SomeClass sc2 = sc1.clone(); //输出为false,说明他们是两个不同SomeClass实例,单例被破坏 System.out.println(sc1 == sc2); } /** * 序列化方式破坏单例 */ @Test public void serializableDestroySomeClass() throws IOException, ClassNotFoundException { SomeClass sc1 = SomeClass.getInstance(); //将sc1序列化,写到file文件中,该文件没有后缀名 ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("file")); oos.writeObject(sc1); oos.close(); //将序列化后的sc1读取出来,并使用它创建sc2对象 ObjectInputStream ois = new ObjectInputStream(new FileInputStream("file")); SomeClass sc2 = (SomeClass) ois.readObject(); //输出为false,说明他们是两个不同SomeClass实例,单例被破坏 System.out.println(sc1 == sc2); } /** * 反射方式破坏单例 */ @Test public void reflectDestroySomeClass() throws NoSuchMethodException, IllegalAccessException, InvocationTargetException, InstantiationException { SomeClass sc1 = SomeClass.getInstance(); Class<SomeClass> cls = SomeClass.class; //获取SomeClass类中定义的构造方法 Constructor<SomeClass> cons = cls.getDeclaredConstructor(); //赋予获取修饰符private构造器的权限 cons.setAccessible(true); //获取SomeClass的实例对象 SomeClass sc2 = cons.newInstance(); //输出为false,说明他们是两个不同SomeClass实例,单例被破坏 System.out.println(sc1 == sc2); } ```