通过反射来操作枚举

本文介绍了如何通过Java的反射API获取枚举类中的值和方法。首先,创建了一个名为TestEnum的枚举类,包含多个枚举常量,并为每个常量定义了私有字段和getter方法。接着,通过反射获取枚举类的常量、私有非静态字段以及对应的getter方法。最后,遍历枚举常量并调用getter方法获取所有字段的值,将结果存储到Map中。这种方法对于理解和操作枚举类的属性非常有用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

通过Class来获取任意枚举常量里面的值和方法

先准备数据
enum TestEnum{
        DEMO(1111,"这是第一个",1),
        DEMO2(2222,"这是第二个",2),
        DEMO3(3333,"这是第三个",3),
        DEMO4(4444,"这是第四个",4),
                ;
        private Integer dictKey;

        private String dictValue;

        private Integer dictIndex;

        TestEnum() {
        }

        TestEnum(Integer dictKey, String dictValue, Integer dictIndex) {
            this.dictKey = dictKey;
            this.dictValue = dictValue;
            this.dictIndex = dictIndex;
        }

        public Integer getDictKey() {
            return dictKey;
        }

        public String getDictValue() {
            return dictValue;
        }

        public Integer getDictIndex() {
            return dictIndex;
        }
    }

那么怎么通过class来获取枚举里面的值呢
思路一:获取所有方法然后想办法筛选出我们想要的方法即可

在这里插入图片描述

思路二:获取所有字段(Field),筛选出来私有非静态字段,然后根据字段名拼接get来获取对应的方法
		Class<TestEnum> testEnumClass = TestEnum.class;
        Class<Enum> clazz = (Class<Enum>) Class.forName(testEnumClass.getName());
        //获取常量
        Enum[] enumConstants = clazz.getEnumConstants();
        //获取public字段
        //Field[] publicFields = poEnumClass.getFields();
        //获取私有非静态字段
        List<Field> privateFields = new ArrayList<>();
        List<Method> methodList = new ArrayList<>();
        Field[] fields = testEnumClass.getDeclaredFields();
        for (Field field:fields){
            if (Modifier.isPrivate(field.getModifiers())&&!(Modifier.isStatic(field.getModifiers()))) {
                privateFields.add(field);
                methodList.add(testEnumClass.getMethod("get"+getMethodName(field.getName())));
            }
        }

首字母转大写

private static String getMethodName(String fildeName) throws Exception{
        byte[] items = fildeName.getBytes();
        items[0] = (byte) ((char) items[0] - 'a' + 'A');
        return new String(items);
    }

让我们打断点看一下筛选出来的方法
在这里插入图片描述
剩下的就直接根据方法获取值即可

完整代码
	@Test
    public void test() throws Exception{
        Class<TestEnum> testEnumClass = TestEnum.class;
        Class<Enum> clazz = (Class<Enum>) Class.forName(testEnumClass.getName());
        //获取常量
        Enum[] enumConstants = clazz.getEnumConstants();
        //获取public字段
        //Field[] publicFields = poEnumClass.getFields();
        //获取字段
        List<Field> privateFields = new ArrayList<>();
        List<Method> methodList = new ArrayList<>();
        Field[] fields = testEnumClass.getDeclaredFields();
        for (Field field:fields){
            if (Modifier.isPrivate(field.getModifiers())&&!(Modifier.isStatic(field.getModifiers()))) {
                privateFields.add(field);
                methodList.add(testEnumClass.getMethod("get"+getMethodName(field.getName())));
            }
        }
        Map<String,Object> dataMap = new HashMap<>();
        for (Method method:methodList){
            List<Object> dataList = new ArrayList<>();
            for (Enum e:enumConstants){
                dataList.add(method.invoke(e));
            }
            dataMap.put(method.getName(),dataList);

        }
        System.out.println(dataMap);
    }

 
    private static String getMethodName(String fildeName) throws Exception{
        byte[] items = fildeName.getBytes();
        items[0] = (byte) ((char) items[0] - 'a' + 'A');
        return new String(items);
    }
结果

在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值