java如何把数据库数据转成枚举

2025-10-08 04:55:02

1、查询数据库数据,这里我直接初始化一个List集合

java如何把数据库数据转成枚举

2、创建EnumDemo类

java如何把数据库数据转成枚举

3、新增动态添加枚举类型的公共方法,我将在最后一步贴出完整代码

java如何把数据库数据转成枚举

4、遍历数据库查出来的字典数据,加入枚举中

java如何把数据库数据转成枚举

5、输出并验证

java如何把数据库数据转成枚举

6、package com.ly.ed;

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.HashMap;

import java.util.List;

import java.util.Map;

import sun.reflect.ConstructorAccessor;

import sun.reflect.FieldAccessor;

import sun.reflect.ReflectionFactory;

public class EnumService {

public static void main(String[] args) {

//1、数据库查询

// List<Map<String, Object>> dataList = daoc.queryData(...);

List<Map<String, Object>> dataList = new ArrayList<Map<String, Object>>();

dataList.add(new HashMap<String, Object>());

dataList.add(new HashMap<String, Object>());

dataList.add(new HashMap<String, Object>());

dataList.add(new HashMap<String, Object>());

dataList.get(0).put("KEY", "MON");

dataList.get(0).put("VALUE", 1);

dataList.get(1).put("KEY", "TUE");

dataList.get(1).put("VALUE", 2);

dataList.get(2).put("KEY", "WED");

dataList.get(2).put("VALUE", 3);

dataList.get(3).put("KEY", "THU");

dataList.get(3).put("VALUE", 4);

//2、添加枚举

for(Map<String, Object> map : dataList) {

addEnum(EnumDemo.class, map.get("KEY").toString(), map.get("VALUE"));

}

        

//3、打印验证

        for (EnumDemo e : EnumDemo.values()) {

            System.out.println(e.toString());

        }

}

@SuppressWarnings("unchecked")

public static <T extends Enum<?>> void addEnum(Class<T> enumType, String name, Object value) {

// 0. Sanity checks

        if (!Enum.class.isAssignableFrom(enumType)) {

            throw new RuntimeException("class " + enumType + " is not an instance of Enum");

        }

        

Field valuesField = null;

        Field[] fields = EnumDemo.class.getDeclaredFields();

        for (Field field : fields) {

            if (field.getName().contains("$VALUES")) {

                valuesField = field;

                break;

            }

        }

        AccessibleObject.setAccessible(new Field[] { valuesField }, true);

        try {

            // 2. Copy it

        T[] previousValues = (T[]) valuesField.get(enumType);

            List<T> values = new ArrayList<T>(Arrays.asList(previousValues));

            // 3. build new enum

            T newValue = (T) makeEnum(enumType, name, values.size(), new Class[]{Integer.class}, new Object[]{value});

            // 4. add new value

            values.add(newValue);

            Object object = values.toArray((EnumDemo[]) Array.newInstance(EnumDemo.class, 0));

            // 5. Set new values field

            setFailsafeFieldValue(valuesField, null, object);

            // 6. Clean enum cache

            cleanEnumCache(EnumDemo.class);

        } catch (Exception e) {

            e.printStackTrace();

            throw new RuntimeException(e.getMessage(), e);

        }

}

private static void cleanEnumCache(Class<?> enumClass) throws NoSuchFieldException, IllegalAccessException {

        blankField(enumClass, "enumConstantDirectory"); // Sun (Oracle?!?) JDK 1.5/6

        blankField(enumClass, "enumConstants"); // IBM JDK

    }

private static void blankField(Class<?> enumClass, String fieldName) throws NoSuchFieldException,IllegalAccessException {

for (Field field : Class.class.getDeclaredFields()) {

    if (field.getName().contains(fieldName)) {

        AccessibleObject.setAccessible(new Field[] { field }, true);

        setFailsafeFieldValue(field, enumClass, null);

        break;

    }

}

}

private static void setFailsafeFieldValue(Field field, Object target, Object value) throws NoSuchFieldException,IllegalAccessException {

// let's make the field accessible

field.setAccessible(true);

// next we change the modifier in the Field instance to

// not be final anymore, thus tricking reflection into

// letting us modify the static final field

Field modifiersField = Field.class.getDeclaredField("modifiers");

modifiersField.setAccessible(true);

int modifiers = modifiersField.getInt(field);

// blank out the final bit in the modifiers int

modifiers &= ~Modifier.FINAL;

modifiersField.setInt(field, modifiers);

FieldAccessor fa = ReflectionFactory.getReflectionFactory().newFieldAccessor(field, false);

fa.set(target, value);

}

private static Object makeEnum(Class<?> enumClass, String value, int ordinal, Class<?>[] additionalTypes,

            Object[] additionalValues) throws Exception {

Object[] parms = new Object[additionalValues.length + 2];

parms[0] = value;

parms[1] = Integer.valueOf(ordinal);

System.arraycopy(additionalValues, 0, parms, 2, additionalValues.length);

return enumClass.cast(getConstructorAccessor(enumClass, additionalTypes).newInstance(parms));

}

private static ConstructorAccessor getConstructorAccessor(Class<?> enumClass, Class<?>[] additionalParameterTypes)

    throws NoSuchMethodException {

Class<?>[] parameterTypes = new Class[additionalParameterTypes.length + 2];

parameterTypes[0] = String.class;

parameterTypes[1] = int.class;

System.arraycopy(additionalParameterTypes, 0, parameterTypes, 2, additionalParameterTypes.length);

return ReflectionFactory.getReflectionFactory().newConstructorAccessor(enumClass.getDeclaredConstructor(parameterTypes));

}

}

声明:本网站引用、摘录或转载内容仅供网站访问者交流或参考,不代表本站立场,如存在版权或非法内容,请联系站长删除,联系邮箱:site.kefu@qq.com。
猜你喜欢