场景:前端有些需要获取枚举类的接口
实现逻辑:通过反射机制写一个通用方法来获取枚举类
1、通用方法实现:
@Slf4j
public class EnumUtils {
@Data
public static class EnumData {
private Object name;
private Object code;
}
/**
* 将枚举类的指定属性转换为EnumData的code和name属性
* @param enumClass 枚举类
* @return
*/
public static List<EnumData> getEnumList(Class<?> enumClass, String codeField, String nameField) {
try {
Object[] oo = enumClass.getEnumConstants();
List<EnumData> list = new LinkedList<>();
for (Object o : oo) {
EnumData enumEntity = convertToEnumMeta(enumClass, o, codeField, nameField);
list.add(enumEntity);
}
return list;
} catch (Exception e) {
log.warn("枚举类 {} 解析异常", enumClass.getCanonicalName(), e);
return Collections.emptyList();
}
}
/**
* 将枚举类对象转换为EnumData 对象
*/
private static EnumData convertToEnumMeta(Class clazz, Object o, String codeField, String nameField) throws Exception {
EnumData enumEntity = new EnumData();
Field field = clazz.getDeclaredField(codeField);
Object code = ReflectUtil.getFieldValue(o, field);
enumEntity.setCode(code);
Field field1 = clazz.getDeclaredField(nameField);
Object name = ReflectUtil.getFieldValue(o, field1);
enumEntity.setName(name);
return enumEntity;
}
}
2、接口调用
这里的“code”和“name”就是枚举类中定义的变量名
@GetMapping(value = "/enum")
public Result<List<EnumUtils.EnumData>> getEnumList() {
return Result.success(EnumUtils.getEnumList(testEnum.class, "code", "name"));
}
返回数据格式如下:
* [
* {
* "code": "value",
* "name": "value"
* },
* {
* "code": "value",
* "name": "value"
* }
* ]