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<String> codeList = new ArrayList<>();
List<String> 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);
}
执行结果:
传统方式.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<Class<? extends BaseEnum>> 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();
}
});
}
执行结果:
image.png
实现方法---第 2 种
和上面的方法相似,只不过换了一种获取get方法的方式,可根据参数获取不同枚举类中枚举
@Test
void getReflexEnumToModel(){
String enumName = "ReflexEnum";
try {
List<ReflexModel> reflexModelList = new ArrayList<ReflexModel>();
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", "指定类型未找到"));
}
执行结果:
image.png
网友评论