场景:
今天工作中遇到一个需求,调用方传入一个json【lable】
{
"student":[
{
"lable":"LINS1"
},
{
"lable":"LINS2"
},
{
"lable":"LINS2"
}
]
}
然后我们使用一个封装好的枚举【不是我们封装】,并且不能修改,但是必须通过传入的json中某个字段来补充对象,然后入库,
enum StudentEnum {
ZS("LINS1","zs", "18"),
LS("LINS2","ls", "16"),
WW("LINS3","ww", "16");
private String lable;
private String name;
private String age;
public String getLable() {
return lable;
}
public void setLable(String lable) {
this.lable = lable;
}
StudentEnum(String lable, String name, String age) {
this.name = name;
this.lable = lable;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAge() {
return age;
}
public void setAge(String age) {
this.age = age;
}
public static StudentEnum getByName(String name) {
StudentEnum[] values = StudentEnum.values();
for (StudentEnum studentEnum : values) {
if (StringUtils.equals(name, studentEnum.getName())) {
return studentEnum;
}
}
return null;
}
}
- Student对象
@Data
public class Student {
private String age;
private String name;
}
解决思路:
可以通过反射来获取对应的枚举对象,然后再把值赋给Student对象
Enum.class.getEnumConstants可以拿到枚举数组
代码实现
@org.junit.Test
public void test5() throws Exception {
Student stu = new Student();
//模拟解析json后的lable的值
String inputLable = "LINS2";
Class<StudentEnum> testEnumClass = StudentEnum.class;
StudentEnum[] enumConstants = testEnumClass.getEnumConstants();
Method getLable = testEnumClass.getMethod("getLable");
Method getName = testEnumClass.getMethod("getName");
Method getAge = testEnumClass.getMethod("getAge");
for (StudentEnum studentEnum : enumConstants) {
if (StringUtils.equals(inputLable,getLable.invoke(studentEnum).toString())){
stu.setAge(getAge.invoke(studentEnum).toString());
stu.setName(getName.invoke(studentEnum).toString());
}
}
System.out.println(stu);
}
运行结果
总结
这个需求主要就是要拿到枚举中的值【key】,其他再用invoke执行得到具体的值,最后封装就可以了。