首页 > 其他分享 >关于字典-用反射将字典动态生成枚举

关于字典-用反射将字典动态生成枚举

时间:2023-03-09 17:11:29浏览次数:42  
标签:反射 enumClass value 枚举 sb Class append 字典

在Java中,枚举(enum)的值是在编译时固定的。因此,不能直接基于字典动态生成枚举。但是,可以使用Java的反射机制来实现类似的效果。以下是一个简单的示例

import java.lang.reflect.Field;
import java.util.HashMap;
import java.util.Map;

public class DynamicEnum {
    public static void main(String[] args) throws NoSuchFieldException, IllegalAccessException {
        Map<String, Integer> myMap = new HashMap<>();
        myMap.put("APPLE", 1);
        myMap.put("ORANGE", 2);
        myMap.put("BANANA", 3);

        Class<?> enumClass = createEnumClass("Fruit", myMap);

        Map<String, Integer> myEnumMap = new HashMap<>();
        for (Object o : enumClass.getEnumConstants()) {
            Field field = enumClass.getDeclaredField("value");
            field.setAccessible(true);
            int value = field.getInt(o);
            myEnumMap.put(o.toString(), value);
        }

        System.out.println(myMap.equals(myEnumMap)); // true
    }

    private static Class<?> createEnumClass(String name, Map<String, Integer> values) {
        StringBuilder sb = new StringBuilder();
        sb.append("public enum ").append(name).append(" {");

        for (String key : values.keySet()) {
            sb.append(key).append("(").append(values.get(key)).append("),");
        }
        sb.deleteCharAt(sb.length() - 1);

        sb.append("; private final int value; ")
          .append(name).append("(int value) { this.value = value; } ")
          .append("public int getValue() { return value; }");

        sb.append("}");

        Class<?> enumClass = null;
        try {
            enumClass = Class.forName(name);
        } catch (ClassNotFoundException e) {
            try {
                ClassLoader classLoader = DynamicEnum.class.getClassLoader();
                enumClass = Class.forName(name, true, classLoader);
            } catch (ClassNotFoundException ex) {
                Class<?> superClass = Enum.class;
                Class<?>[] interfaces = new Class<?>[] { MyInterface.class };
                enumClass = sun.misc.Unsafe.getUnsafe().defineAnonymousClass(superClass, sb.toString(), null);
            }
        }

        return enumClass;
    }

    public interface MyInterface {
        int getValue();
    }
}

  

在此示例中,我们首先创建了一个名为myMap的字典,其中包含三个元素,与要创建的枚举中相同。然后,我们调用了createEnumClass()方法,该方法使用字符串构建器(StringBuilder)创建一个枚举类的字符串表示形式,并使用Java反射API动态定义枚举类。在createEnumClass()方法中,我们遍历values字典,并将每个键和值添加到字符串构建器中。我们还添加了一个value字段和一个构造函数,该构造函数将值作为参数,并将值分配给value字段。最后,我们定义了一个getValue()方法,该方法返回value字段的值。

main()方法中,我们获取枚举类中的所有值,并遍历它们以填充myEnumMap字典。在遍历枚举值时,我们使用反射API获取value字段

标签:反射,enumClass,value,枚举,sb,Class,append,字典
From: https://www.cnblogs.com/origin-zy/p/17199197.html

相关文章

  • python: 字典的keys() values() 取得字典的键与值
    >>>attr={"class":"avdatacard","data-hash-id":"data-hash-id"}>>>attr.keys()dict_keys(['class','data-hash-id'])>>>list(attr.keys())['class','da......
  • Middle Duplication (CFD2E) (贪心,中序树,字典序大小.dfs)
      大佬的思路:  #include<bits/stdc++.h>usingnamespacestd;intn,k,l[200010],r[200010],pos[200010];charc[200010];vector<int>seq;voidprecalc(i......
  • MFC-EnumWindows枚举顶层窗口
     BOOLCALLBACKEnumWindowsProc(HWNDhwnd,LPARAMlParam)//回调函数//参数1:EnumWindows函数自动传过来的句柄//参数2:就是EnumWindows函数参数2的值{......
  • [java基础]-反射
    (一)反射:框架设计的灵魂1.反射介绍*框架:半成品软件。可以在框架的基础上进行软件开发,简化编码*反射:将类的各个组成部分封装为其他对象,这就是反射机制 *好处: 1.可以......
  • Windows 11提示“无法枚举容器中的对象。”
    *为什么会出现这一错误提示?*在Windows系统当中,对文件或文件夹的权限进行设置可以有效地保护隐私内容。登录管理员账户可以对权限进行更改,并且有权决定是否将内容共享给......
  • C# 反射(Reflection)
    C#反射(Reflection)反射提供描述程序集、模块和类型的对象(Type类型)。可以使用反射动态地创建类型的实例,将类型绑定到现有对象,或从现有对象中获取类型,然后调用......
  • 使用反射简化批量保存sql语句
    写批量保存的时候遇到实体类字段比较多的时候写起来非常的头疼,所以我想能不能通过程序自动获取拼接思路:1.通过反射获取实体类的所有字段2.把字段拼接为id,user_name,us......
  • java的反射
    1.获取class对象的三种方式Class.forName();类名.class实例对象.getClass();2.利用反射获取构造函数Constructor<?>[]getConstructor()返回所有公共构造方法......
  • C语言-结构、联合、枚举
    结构使用struct关键词,可以创造新的类型。关键词struct取自structure,中文翻译为结构。这种由多个不同的数据类型组成的类型,被称为结构。struct{ charname[20]; intg......
  • Class类常用方法介绍、获取Class对象的方式、通过反射实现各种骚操作
    (目录)Class类基本介绍Class类图:Class也是类,因此也继承Object类Class类对象不是new出来的,而是系统创建的对于某个类的Class类对象,在内存中只有一份,因为类只加载一......