java反射 枚举_Java反射应用之获取枚举类的枚举

本文介绍了在Java中如何利用反射获取枚举类中的枚举值。通过示例展示了传统方式和反射方式创建对象,以及两种不同的反射方法,包括获取枚举包下实现特定接口的枚举类及其属性值。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Java反射实际应用

实际工作中使用到的Java反射并不是很多,我接触到的基本上都是工具类中相对比较常用一些,本篇文章就是我实际工作中遇到的场景。

应用场景:一个审批流程第一个节点审批时,需要填写第二个节点的三个办理人员数据,三个办理人员的角色是固定的枚举类中的枚举值,这样第一个节点审批提交时,我们就需要创建三个不同角色的办理对象,创建对象时只需要获取枚举中的所有枚举,然后循环创建多个对象即可;这里用到获取枚举类中所有的枚举,就可以用反射的方式来获取,最终的到的是一个集合,这里我提供多种方法,通过反射方式和传统的方式都有,欢迎一起交流学习!

首先提供对应的枚举类:

public enum ReflexEnum {

TEST_1("1", "测试1"),

TEST_2("2", "测试2"),

TEST_3("3", "测试3"),

TEST_4("4", "测试4");

private String code;

private String desc;

public String getCode() {

return code;

}

public void setCode(String code) {

this.code = code;

}

public String getDesc() {

return desc;

}

public void setDesc(String desc) {

this.desc = desc;

}

private ReflexEnum(String code, String desc) {

this.code = code;

this.desc = desc;

}

}

传统方式:

@Test

void getAssignEnumValue() {

List codeList = new ArrayList<>();

List descList = new ArrayList<>();

Map map = new HashMap();

for (ReflexEnum value : ReflexEnum.values()) {

String code = value.getCode();

String desc = value.getDesc();

codeList.add(code);

descList.add(desc);

map.put(code, desc);

}

System.out.println(codeList);

System.out.println(descList);

System.out.println(map);

}

执行结果:

a61aba03270c

传统方式.png

反射方式:需要提供一个接口类,然后枚举类实现接口类来完成

获取枚举包下实现BaseEnum接口的所有枚举类及对应属性值

提供接口类,

public interface BaseEnum {

String getCode();

String getDesc();

}

上面的枚举类实现这个接口类

public enum ReflexEnum implements BaseEnum{}

实现方法---第 1 种

可以获取枚举包下面的所有枚举类的属性

@Test

void getReflexValue() {

Reflections reflections = new Reflections("com.chuxin.reflex.enums");

Set> monitorClasses = reflections.getSubTypesOf(BaseEnum.class);

System.out.println("size:" + monitorClasses.size());

monitorClasses.forEach(m -> {

try {

System.out.println("name:" + m.getSimpleName());

BaseEnum[] enumConstants = m.getEnumConstants();

for (BaseEnum anEnum : enumConstants) {

System.out.println("enumName:" + anEnum + " value:" + anEnum.getCode() + " name:" + anEnum.getDesc());

}

} catch (Exception e) {

e.printStackTrace();

}

});

}

执行结果:

a61aba03270c

image.png

实现方法---第 2 种

和上面的方法相似,只不过换了一种获取get方法的方式,可根据参数获取不同枚举类中枚举

@Test

void getReflexEnumToModel(){

String enumName = "ReflexEnum";

try {

List reflexModelList = new ArrayList();

Class cls = Class.forName("com.chuxin.reflex.enums." + enumName);

Method method = cls.getMethod("values");

BaseEnum inter[] = (BaseEnum[]) method.invoke(null, null);

for (BaseEnum enumMessage : inter) {

ReflexModel vo = new ReflexModel();

vo.setCode( enumMessage.getCode() );

vo.setDesc( enumMessage.getDesc() );

reflexModelList.add(vo);

}

for (ReflexModel reflexModel : reflexModelList) {

System.out.println("code:"+reflexModel.getCode() +" ======= desc:"+ reflexModel.getDesc());

}

return;

} catch (ClassNotFoundException e) {

e.printStackTrace();

} catch (NoSuchMethodException e) {

e.printStackTrace();

} catch (IllegalAccessException e) {

e.printStackTrace();

} catch (InvocationTargetException e) {

e.printStackTrace();

}

System.out.println(Collections.singletonMap("ERROR", "指定类型未找到"));

}

执行结果:

a61aba03270c

image.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值