1. 首先理解反射
- Java反射机制是在运行状态中,对于任意一个类(class文件),都可以知道该类的所有属性和方法;
- 对于任意一个对象,都能够调用它的任意一个方法和属性;
- 这种动态获取的信息已经动态调用对象的方法的功能称为java语言的反射机制。
2. java获取Class对象的三种方式
- Class.forName(“类路径”);
- 调用属性,通过.class来获取其对应的Class对象;
- 利用对象调用Object的getClass方法
3. 通过反射将枚举数据封装进实体类实例
- 枚举类Enum
package qs.enums;
public enum Enum {
FRUIT1(1,"苹果"),
FRUIT2(2,"香蕉"),
FRUIT3(3,"橘子")
;
private Integer key;
private String value;
Enum(Integer key, String value) {
this.key = key;
this.value = value;
}
public Integer getKey() {
return key;
}
public void setKey(Integer key) {
this.key = key;
}
public String getValue() {
return value;
}
public void setValue(String value) {
this.value = value;
}
}
- 实体类EnumEntity
package qs.enums;
public class EnumEntity {
private Integer key;
private String value;
public Integer getKey() {
return key;
}
public void setKey(Integer key) {
this.key = key;
}
public String getValue() {
return value;
}
public void setValue(String value) {
this.value = value;
}
}
- 封装Enum为EnumEntity,最后以list形式输出
package qs.enums;
import com.alibaba.fastjson.JSON;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.List;
public class TestEnums {
public static void main(String[] args) {
getEnums();
}
private static void getEnums() {
try {
Class<?> clz = Class.forName("qs.enums.Enum");
Object[] enumConstants = clz.getEnumConstants();
Method getKey = clz.getMethod("getKey");
Method getValue = clz.getMethod("getValue");
List<EnumEntity> list = new ArrayList<>();
EnumEntity enumEntity = null;
for (Object enumConstant : enumConstants) {
enumEntity = new EnumEntity();
int key = Integer.parseInt(String.valueOf(getKey.invoke(enumConstant)));
String value = String.valueOf(getValue.invoke(enumConstant));
enumEntity.setKey(key);
enumEntity.setValue(value);
System.out.println("key>>:" + key + " value>>:" + value);
list.add(enumEntity);
}
System.out.println(JSON.toJSONString(list));
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (NoSuchMethodException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
}
}
- 输出结果