From b507f4e478644f60d8fa9fd112fe6c0745339303 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?F=E5=98=89=E9=98=B3?= Date: Mon, 24 Sep 2018 16:33:46 +0800 Subject: [PATCH] =?UTF-8?q?=E5=BA=8F=E5=88=97=E5=8C=96=E6=94=BB=E5=87=BB?= =?UTF-8?q?=E8=A1=A5=E5=85=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../pattern/creational/singleton/HungrySingleton.java | 8 ++++++++ .../singleton/HungrySingletonSerializableImprove.java | 10 ++++++++-- 2 files changed, 16 insertions(+), 2 deletions(-) diff --git a/src/main/java/top/fjy8018/designpattern/pattern/creational/singleton/HungrySingleton.java b/src/main/java/top/fjy8018/designpattern/pattern/creational/singleton/HungrySingleton.java index dcd62fc..4cf6d76 100644 --- a/src/main/java/top/fjy8018/designpattern/pattern/creational/singleton/HungrySingleton.java +++ b/src/main/java/top/fjy8018/designpattern/pattern/creational/singleton/HungrySingleton.java @@ -1,5 +1,7 @@ package top.fjy8018.designpattern.pattern.creational.singleton; +import lombok.extern.slf4j.Slf4j; + import java.io.Serializable; /** @@ -10,6 +12,7 @@ import java.io.Serializable; * @author F嘉阳 * @date 2018-09-24 15:38 */ +@Slf4j public class HungrySingleton implements Serializable { /** * 类加载时初始化 @@ -18,10 +21,15 @@ public class HungrySingleton implements Serializable { private static final HungrySingleton HUNGRYSINGLETON; static { + log.debug(HungrySingleton.class.getSimpleName() + "静态块实例化"); HUNGRYSINGLETON = new HungrySingleton(); } + /** + * 该构造器会在反射攻击时调用 + */ private HungrySingleton() { + log.debug(HungrySingleton.class.getSimpleName() + "构造器实例化"); } public static HungrySingleton getInstance() { diff --git a/src/main/java/top/fjy8018/designpattern/pattern/creational/singleton/HungrySingletonSerializableImprove.java b/src/main/java/top/fjy8018/designpattern/pattern/creational/singleton/HungrySingletonSerializableImprove.java index 307bce2..fb962fc 100644 --- a/src/main/java/top/fjy8018/designpattern/pattern/creational/singleton/HungrySingletonSerializableImprove.java +++ b/src/main/java/top/fjy8018/designpattern/pattern/creational/singleton/HungrySingletonSerializableImprove.java @@ -1,5 +1,7 @@ package top.fjy8018.designpattern.pattern.creational.singleton; +import lombok.extern.slf4j.Slf4j; + import java.io.ObjectInputStream; import java.io.ObjectStreamClass; import java.io.Serializable; @@ -13,21 +15,24 @@ import java.io.Serializable; * 返回true后序列化过程通过反射机制实例化该类 *

* 改进方法:在{@link ObjectInputStream#readOrdinaryObject(boolean)} 2071行会检测内部方法 - * 在{@link ObjectStreamClass#hasReadResolveMethod()} 中,判断是否存在名为readResolve的方法,方法名定义在522行 - * 若有该方法,则用该方法返回的对象写入 + * 在{@link ObjectStreamClass#hasReadResolveMethod()} 中,此时已经实例化了一个新对象,之后判断是否存在名为readResolve的方法,方法名定义在522行 + * 若有该方法,则用该方法返回的对象替换之前实例化的新对象 * * @author F嘉阳 * @date 2018-09-24 15:38 */ +@Slf4j public class HungrySingletonSerializableImprove implements Serializable { private static final HungrySingletonSerializableImprove HUNGRYSINGLETON; static { + log.debug(HungrySingletonSerializableImprove.class.getSimpleName() + "实例化"); HUNGRYSINGLETON = new HungrySingletonSerializableImprove(); } private HungrySingletonSerializableImprove() { + log.debug(HungrySingletonSerializableImprove.class.getSimpleName() + "实例化"); } public static HungrySingletonSerializableImprove getInstance() { @@ -40,6 +45,7 @@ public class HungrySingletonSerializableImprove implements Serializable { * @return */ private Object readResolve() { + log.debug("序列化获取对象"); return HUNGRYSINGLETON; }