From 78a266fa8659e71407de6f8ce686e59138feab6b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?F=E5=98=89=E9=98=B3?= Date: Mon, 24 Sep 2018 22:27:03 +0800 Subject: [PATCH] =?UTF-8?q?=E6=9E=9A=E4=B8=BE=E7=B1=BB=E5=AE=9E=E7=8E=B0?= =?UTF-8?q?=E5=8D=95=E4=BE=8B=EF=BC=8C=E6=B7=BB=E5=8A=A0=E6=9E=9A=E4=B8=BE?= =?UTF-8?q?=E7=B1=BB=E5=86=85=E9=83=A8=E6=96=B9=E6=B3=95=EF=BC=8C=E5=8F=8D?= =?UTF-8?q?=E7=BC=96=E8=AF=91=E6=96=87=E4=BB=B6=E5=B1=95=E7=A4=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- jad/{EnumInstance.jad => EnumInstance.java} | 5 +- jad/EnumInstance_addMethod.java | 68 +++++++++++++++++++ .../creational/singleton/EnumInstance.java | 19 ++++-- .../singleton/EnumInstanceTest.java | 14 ++++ .../singleton/SingletonReflectAttack.java | 4 +- .../SingletonSerializableAttackTest.java | 2 +- 6 files changed, 103 insertions(+), 9 deletions(-) rename jad/{EnumInstance.jad => EnumInstance.java} (82%) create mode 100644 jad/EnumInstance_addMethod.java create mode 100644 src/test/java/top/fjy8018/designpattern/pattern/creational/singleton/EnumInstanceTest.java diff --git a/jad/EnumInstance.jad b/jad/EnumInstance.java similarity index 82% rename from jad/EnumInstance.jad rename to jad/EnumInstance.java index a7d267b..71bf3bc 100644 --- a/jad/EnumInstance.jad +++ b/jad/EnumInstance.java @@ -5,6 +5,8 @@ package top.fjy8018.designpattern.pattern.creational.singleton; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; public final class EnumInstance extends Enum { @@ -34,12 +36,13 @@ public final class EnumInstance extends Enum this.data = data; } - public Object getInstance() + public static EnumInstance getInstance() { return INSTANCE; } public static final EnumInstance INSTANCE; + private static final Logger log = LoggerFactory.getLogger(top/fjy8018/designpattern/pattern/creational/singleton/EnumInstance); private Object data; private static final EnumInstance $VALUES[]; diff --git a/jad/EnumInstance_addMethod.java b/jad/EnumInstance_addMethod.java new file mode 100644 index 0000000..ab6935f --- /dev/null +++ b/jad/EnumInstance_addMethod.java @@ -0,0 +1,68 @@ +// Decompiled by Jad v1.5.8g. Copyright 2001 Pavel Kouznetsov. +// Jad home page: http://www.kpdus.com/jad.html +// Decompiler options: packimports(3) +// Source File Name: EnumInstance.java + +package top.fjy8018.designpattern.pattern.creational.singleton; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public abstract class EnumInstance extends Enum +{ + + public static EnumInstance[] values() + { + return (EnumInstance[])$VALUES.clone(); + } + + public static EnumInstance valueOf(String name) + { + return (EnumInstance)Enum.valueOf(top/fjy8018/designpattern/pattern/creational/singleton/EnumInstance, name); + } + + private EnumInstance(String s, int i) + { + super(s, i); + } + + protected abstract void logTest(); + + public Object getData() + { + return data; + } + + public void setData(Object data) + { + this.data = data; + } + + public static EnumInstance getInstance() + { + return INSTANCE; + } + + + public static final EnumInstance INSTANCE; + private static final Logger log = LoggerFactory.getLogger(top/fjy8018/designpattern/pattern/creational/singleton/EnumInstance); + private Object data; + private static final EnumInstance $VALUES[]; + + static + { + INSTANCE = new EnumInstance("INSTANCE", 0) { + + protected void logTest() + { + EnumInstance.log.info((new StringBuilder()).append(top/fjy8018/designpattern/pattern/creational/singleton/EnumInstance.getSimpleName()).append("\u6253\u5370\u8F93\u51FA").toString()); + } + + } +; + $VALUES = (new EnumInstance[] { + INSTANCE + }); + } + +} diff --git a/src/main/java/top/fjy8018/designpattern/pattern/creational/singleton/EnumInstance.java b/src/main/java/top/fjy8018/designpattern/pattern/creational/singleton/EnumInstance.java index 61327bf..08c5079 100644 --- a/src/main/java/top/fjy8018/designpattern/pattern/creational/singleton/EnumInstance.java +++ b/src/main/java/top/fjy8018/designpattern/pattern/creational/singleton/EnumInstance.java @@ -1,5 +1,7 @@ package top.fjy8018.designpattern.pattern.creational.singleton; +import lombok.extern.slf4j.Slf4j; + /** * 枚举单例模式(effective Java推荐) * 枚举类天生可序列化,有效防止序列化攻击 @@ -13,11 +15,21 @@ package top.fjy8018.designpattern.pattern.creational.singleton; * @author F嘉阳 * @date 2018-09-24 20:30 */ +@Slf4j public enum EnumInstance { /** * 单例枚举 */ - INSTANCE; + INSTANCE { + @Override + protected void logTest() { + log.info(EnumInstance.class.getSimpleName() + "打印输出"); + } + }; + + public static EnumInstance getInstance() { + return INSTANCE; + } /** * 目标实例化对象 @@ -32,7 +44,6 @@ public enum EnumInstance { this.data = data; } - public Object getInstance() { - return INSTANCE; - } + // 提供外部访问方法入口 + protected abstract void logTest(); } diff --git a/src/test/java/top/fjy8018/designpattern/pattern/creational/singleton/EnumInstanceTest.java b/src/test/java/top/fjy8018/designpattern/pattern/creational/singleton/EnumInstanceTest.java new file mode 100644 index 0000000..3995be4 --- /dev/null +++ b/src/test/java/top/fjy8018/designpattern/pattern/creational/singleton/EnumInstanceTest.java @@ -0,0 +1,14 @@ +package top.fjy8018.designpattern.pattern.creational.singleton; + +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.*; + +class EnumInstanceTest { + + @Test + void logTest() { + EnumInstance instance = EnumInstance.getInstance(); + instance.logTest(); + } +} \ No newline at end of file diff --git a/src/test/java/top/fjy8018/designpattern/pattern/creational/singleton/SingletonReflectAttack.java b/src/test/java/top/fjy8018/designpattern/pattern/creational/singleton/SingletonReflectAttack.java index 804a985..d3f198b 100644 --- a/src/test/java/top/fjy8018/designpattern/pattern/creational/singleton/SingletonReflectAttack.java +++ b/src/test/java/top/fjy8018/designpattern/pattern/creational/singleton/SingletonReflectAttack.java @@ -7,8 +7,6 @@ import java.lang.reflect.Constructor; import java.lang.reflect.Field; import java.lang.reflect.InvocationTargetException; -import static org.junit.jupiter.api.Assertions.*; - /** * 单例模式反射攻击 */ @@ -37,7 +35,7 @@ class SingletonReflectAttack { // 通过反射获取实例 EnumInstance reflectInstance = (EnumInstance) constructor.newInstance("fjy", 123); // 通过正常方式获取 - EnumInstance instance = EnumInstance.INSTANCE; + EnumInstance instance = EnumInstance.getInstance(); // 判断是否同一个对象 log.info("反射方式:" + reflectInstance.getData()); diff --git a/src/test/java/top/fjy8018/designpattern/pattern/creational/singleton/SingletonSerializableAttackTest.java b/src/test/java/top/fjy8018/designpattern/pattern/creational/singleton/SingletonSerializableAttackTest.java index da03945..d9db375 100644 --- a/src/test/java/top/fjy8018/designpattern/pattern/creational/singleton/SingletonSerializableAttackTest.java +++ b/src/test/java/top/fjy8018/designpattern/pattern/creational/singleton/SingletonSerializableAttackTest.java @@ -41,7 +41,7 @@ class SingletonSerializableAttackTest { @Test void EnumInstanceGetInstance() throws Exception { - EnumInstance singleton = EnumInstance.INSTANCE; + EnumInstance singleton = EnumInstance.getInstance(); singleton.setData(new Object()); ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(FILE_NAME));