枚举类实现单例,添加枚举类内部方法,反编译文件展示

This commit is contained in:
2018-09-24 22:27:03 +08:00
parent 348287d64e
commit 78a266fa86
6 changed files with 103 additions and 9 deletions

View File

@@ -5,6 +5,8 @@
package top.fjy8018.designpattern.pattern.creational.singleton; package top.fjy8018.designpattern.pattern.creational.singleton;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public final class EnumInstance extends Enum public final class EnumInstance extends Enum
{ {
@@ -34,12 +36,13 @@ public final class EnumInstance extends Enum
this.data = data; this.data = data;
} }
public Object getInstance() public static EnumInstance getInstance()
{ {
return INSTANCE; return INSTANCE;
} }
public static final EnumInstance INSTANCE; public static final EnumInstance INSTANCE;
private static final Logger log = LoggerFactory.getLogger(top/fjy8018/designpattern/pattern/creational/singleton/EnumInstance);
private Object data; private Object data;
private static final EnumInstance $VALUES[]; private static final EnumInstance $VALUES[];

View File

@@ -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
});
}
}

View File

@@ -1,5 +1,7 @@
package top.fjy8018.designpattern.pattern.creational.singleton; package top.fjy8018.designpattern.pattern.creational.singleton;
import lombok.extern.slf4j.Slf4j;
/** /**
* 枚举单例模式effective Java推荐 * 枚举单例模式effective Java推荐
* 枚举类天生可序列化,有效防止序列化攻击 * 枚举类天生可序列化,有效防止序列化攻击
@@ -13,11 +15,21 @@ package top.fjy8018.designpattern.pattern.creational.singleton;
* @author F嘉阳 * @author F嘉阳
* @date 2018-09-24 20:30 * @date 2018-09-24 20:30
*/ */
@Slf4j
public enum EnumInstance { 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; this.data = data;
} }
public Object getInstance() { // 提供外部访问方法入口
return INSTANCE; protected abstract void logTest();
}
} }

View File

@@ -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();
}
}

View File

@@ -7,8 +7,6 @@ import java.lang.reflect.Constructor;
import java.lang.reflect.Field; import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException; 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 reflectInstance = (EnumInstance) constructor.newInstance("fjy", 123);
// 通过正常方式获取 // 通过正常方式获取
EnumInstance instance = EnumInstance.INSTANCE; EnumInstance instance = EnumInstance.getInstance();
// 判断是否同一个对象 // 判断是否同一个对象
log.info("反射方式:" + reflectInstance.getData()); log.info("反射方式:" + reflectInstance.getData());

View File

@@ -41,7 +41,7 @@ class SingletonSerializableAttackTest {
@Test @Test
void EnumInstanceGetInstance() throws Exception { void EnumInstanceGetInstance() throws Exception {
EnumInstance singleton = EnumInstance.INSTANCE; EnumInstance singleton = EnumInstance.getInstance();
singleton.setData(new Object()); singleton.setData(new Object());
ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(FILE_NAME)); ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(FILE_NAME));