手抄报 安全手抄报 手抄报内容 手抄报图片 英语手抄报 清明节手抄报 节约用水手抄报

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

时间:2024-10-12 10:55:40

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 accessiblefield.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 fieldField modifiersField = Field.class.getDeclaredField("modifiers");modifiersField.setAccessible(true);int modifiers = modifiersField.getInt(field);// blank out the final bit in the modifiers intmodifiers &= ~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));}}

© 手抄报圈