枚举类实现单例,添加枚举类内部方法,反编译文件展示
This commit is contained in:
@@ -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[];
|
||||||
|
|
||||||
68
jad/EnumInstance_addMethod.java
Normal file
68
jad/EnumInstance_addMethod.java
Normal 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
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -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();
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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();
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -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());
|
||||||
|
|||||||
@@ -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));
|
||||||
|
|||||||
Reference in New Issue
Block a user