运行时修改枚举测试类之增删改查

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

前几天在想一个功能时,卡壳了,搞了几天,终于完成了所想。
问题描述:
三级菜单联动、下拉框的选项等,都在字典表中做维护,在功能查询时,每个方法几乎能能用到,很频繁的查数据库。当然,对于增删改的操作很少,但也会有这方面的需求,因此,才会在字典表中做了增删改的维护。
但是,在日常操作中,百分之九十几的操作中只用到了查,也就是说每一步操作,可能就要去这个字典表中查询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.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值