* 反射和反序列化可以破解除了枚举之外的4种实现方式。
反射破解单例:
TestDcl dcl1 = TestDcl.getInstance();
TestDcl dcl2 = TestDcl.getInstance();
System.out.println(dcl1);
System.out.println(dcl2);
//反射破解单例 两个不一样
Class<TestDcl> c = (Class<TestDcl>) Class.forName("cn.oyh.thread.TestDcl");
Constructor<TestDcl> con =c.getDeclaredConstructor();
con.setAccessible(true);
TestDcl dcl3 = con.newInstance();
TestDcl dcl4 = con.newInstance();
System.out.println(dcl3);
System.out.println(dcl4);
上面的TestDcl在这里可以找到,执行:
cn.oyh.thread.TestDcl@1540e19d
cn.oyh.thread.TestDcl@1540e19d
cn.oyh.thread.TestDcl@677327