首页 > 编程知识 正文

java获取对象列表属性,java获取对象地址

时间:2023-05-03 09:26:59 阅读:272439 作者:2205

场景:

在开发过程中,经常会遇到需要根据枚举的code获取对应name或根据name获取对应code的需求;抑或是需要根据code或name获取对应枚举对象。
在开发过程中,前端需要获取下拉选择器中的数据项,通常存放数据库字典表中,本文采取返回枚举列表的方式提供。

一、Enum根据code/name获取枚举对象、根据code获取name、根据name获取code。 @Getter @AllArgsConstructor public enum BorrowStatusEnum { /** * 借基差还款状态 */ IN_USE("IN_USE", "使用中"), OVERDUE("OVERDUE", "已超期"), DEDUCTION("DEDUCTION", "抵扣中"), FINISH("FINISH", "已还款"); /** * 状态 */ public final String code; /** * 名称 */ public final String name; /** * 根据code查找 * @param code 枚举code * @return 枚举对象 */ public static BorrowStatusEnum findEnumByCode(String code) { for (BorrowStatusEnum statusEnum : BorrowStatusEnum.values()) { if (statusEnum.getCode().equals(code)) { //如果需要直接返回name则更改返回类型为String,return statusEnum.name; return statusEnum; } } throw new IllegalArgumentException("code is invalid"); } /** * 根据name查找 * @param name 枚举name * @return 枚举对象 */ public static BorrowStatusEnum findEnumByName(String name) { for (BorrowStatusEnum statusEnum : BorrowStatusEnum.values()) { if (statusEnum.getName().equals(name)) { //如果需要直接返回code则更改返回类型为String,return statusEnum.code; return statusEnum; } } throw new IllegalArgumentException("name is invalid"); } } 测试: public static void main(String[] args) { System.out.println("根据code获取枚举对象:" + BorrowStatusEnum.findEnumByCode("IN_USE")); System.out.println("根据name获取枚举对象:" + BorrowStatusEnum.findEnumByName("已还款")); System.out.println("根据code获取name:" + BorrowStatusEnum.findEnumByCode("IN_USE").name); System.out.println("根据name获取code:" + BorrowStatusEnum.findEnumByName("已还款").code); } 输出: 根据code获取枚举对象:IN_USE根据name获取枚举对象:FINISH根据code获取name:使用中根据name获取code:FINISH 二、获取Enum列表 @Getter @AllArgsConstructor public enum BorrowStatusEnum { /** * 借基差还款状态 */ IN_USE("IN_USE", "使用中"), OVERDUE("OVERDUE", "已超期"), DEDUCTION("DEDUCTION", "抵扣中"), FINISH("FINISH", "已还款"); /** * 状态 */ public final String code; /** * 名称 */ public final String name; /** * 转为数据 * @return 枚举对象数组 */ public static List<Map<String, String>> toList() { List<Map<String, String>> list = new ArrayList<>(); for (BorrowStatusEnum item : BorrowStatusEnum.values()) { Map<String, String> map = new HashMap<>(); map.put("code", item.getCode()); map.put("name", item.getName()); list.add(map); } return list; } } 测试: public static void main(String[] args) { System.out.println("enum toString:" + BorrowStatusEnum.toList()); } 输出: enum toString:[{code=IN_USE, name=使用中}, {code=OVERDUE, name=已超期}, {code=DEDUCTION, name=抵扣中}, {code=FINISH, name=已还款}] 三、附上获取Enum列表工具类(使用工具类就不需要每个Enum都加一遍toList方法了!) public class EnumUtils { private static final String ENUM_CLASSPATH ="java.lang.Enum"; public static List<Map<String, Object>> enumToListMap(Class<?> enumClass) { List<Map<String, Object>> resultList= new ArrayList<>(); if (!ENUM_CLASSPATH.equals(enumClass.getSuperclass().getCanonicalName())) { return resultList; } // 获取所有public方法 Method[] methods = enumClass.getMethods(); List<Field> fieldList = new ArrayList<>(); //1.通过get方法提取字段,避免get作为自定义方法的开头,建议使用 ‘find’或其余命名 Arrays.stream(methods) .map(Method::getName) .filter( methodName -> methodName.startsWith("get") && !"getDeclaringClass".equals(methodName) && !"getClass".equals(methodName) ).forEachOrdered(methodName -> { try { Field field = enumClass.getDeclaredField(StringUtils.uncapitalize(methodName.substring(3))); fieldList.add(field); } catch (NoSuchFieldException | SecurityException e) { e.printStackTrace(); } }); //2.将字段作为key,逐一把枚举值作为value 存入list if (CollectionUtils.isEmpty(fieldList)) { return resultList; } Enum[] enums = (Enum[]) enumClass.getEnumConstants(); for (Enum anEnum : enums) { Map<String, Object> map = new HashMap<>(fieldList.size()); for (Field field : fieldList) { field.setAccessible(true); try { // 向map集合添加字段名称 和 字段值 map.put(field.getName(), field.get(anEnum)); } catch (IllegalArgumentException | IllegalAccessException e) { e.printStackTrace(); } } // 将Map添加到集合中 resultList.add(map); } return resultList; } } 测试: public static void main(String[] args) { //调用时需传入枚举类.class System.out.println("EnumUtils.enumToListMap:" + EnumUtils.enumToListMap(StatusEnum.BorrowStatusEnum.class)); } 输出: EnumUtils.enumToListMap:[{name=使用中, code=IN_USE}, {name=已超期, code=OVERDUE}, {name=抵扣中, code=DEDUCTION}, {name=已还款, code=FINISH}] 工具类参考博客:https://blog.csdn.net/qq_35387940/article/details/113772411

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。