前几天在想一个功能时,卡壳了,搞了几天,终于完成了所想。
问题描述:
三级菜单联动、下拉框的选项等,都在字典表中做维护,在功能查询时,每个方法几乎能能用到,很频繁的查数据库。当然,对于增删改的操作很少,但也会有这方面的需求,因此,才会在字典表中做了增删改的维护。
但是,在日常操作中,百分之九十几的操作中只用到了查,也就是说每一步操作,可能就要去这个字典表中查询n次。我就在想,能不能将这些"常量"全部分成n各枚举类型,每次查的时候不用去数据库中查,而是通过枚举类“.”枚举值去获取数据。
然而,这些又不是一成不变的常量,字典中回去做修改。
那么,能不能当我在字典中修改时,也去动态地去修改我的枚举类呢?
感谢各博主前辈们的分享,终于东拼西凑,解决了这一问题。于是,我也将我写的示例分享出来,供后来者参考。
首先,我先建了个枚举类
public enum EnumTest {
a(111,"AAA",12),
b(222,"BBB",12),
c(333,"CCC",12);
private int value;
private String text;
private int num;
EnumTest(int value,String text,int num){
this.value = value;
this.text = text;
this.num = num;
}
public int getValue() {
return value;
}
public void setValue(int value) {
this.value = value;
}
public String getText() {
return text;
}
public void setText(String text) {
this.text = text;
}
public int getNum() {
return num;
}
public void setNum(int num) {
this.num = num;
}
@Override
public String toString() {
return "EnumTest{" +
"value=" + value +
", text='" + text + '\'' +
", num=" + num +
'}';
}
}
然后,借鉴前辈封装的添加方法,我进行扩展了删除,并进行一些中文注释
import java.lang.reflect.AccessibleObject;
import java.lang.reflect.Array;
import java.lang.reflect.Field;
import java.lang.reflect.Modifier;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import sun.reflect.ConstructorAccessor;
import sun.reflect.FieldAccessor;
import sun.reflect.ReflectionFactory;
class DynamicEnumUtil {
private static ReflectionFactory reflectionFactory = ReflectionFactory.getReflectionFactory();
private static void setFailsafeFieldValue(Field field, Object target,
Object value) throws NoSuchFieldException, IllegalAccessException {
//令这个字段(field)变成可访问
field.setAccessible(true);
//接下来通过反射机制将字段的修饰符由‘最终的’改为’可访问的‘
//getDeclaredField(name) 返回一个 Field 对象,该对象反映此 Class 对象所表示的类或接口的指定已声明字段。
// name 参数是一个 String,它指定所需字段的简称。
Field modifiersField = Field.class.getDeclaredField("modifiers");
modifiersField.setAccessible(true);
//PUBLIC: 1、PRIVATE: 2、PROTECTED: 4、STATIC: 8、FINAL: 16、SYNCHRONIZED: 32、
//VOLATILE: 64、TRANSIENT: 128、NATIVE: 256、INTERFACE: 512、ABSTRACT: 1024、STRICT: 2048
int modifiers = modifiersField.getInt(field);
//清空修饰符int中的最后一位
//&:位与运算符,只有两个操作数都是true,结果才是true; ~:位非运算符:如果位为0,结果是1,如果位为1,结果是0.
modifiers &= ~Modifier.FINAL;
modifiersField.setInt(field, modifiers);
FieldAccessor fa = reflectionFactory.newFieldAccessor(field, false);
fa.set(target, value);
}
private static void blankField(Class<?> enumClass,
String fieldName) throws NoSuchFieldException, IllegalAccessException {
for (Field field : Class.class.

本文探讨在日常开发中如何通过枚举类提高查询效率,同时解决枚举值需要随字典表动态更新的问题。通过反射技术,实现了枚举的增删改查功能,并提供测试用例,以应对系统重启后数据还原的情况。
1687

被折叠的 条评论
为什么被折叠?



