总代码
private <T> List<T> convertToEntityList(Class<T> clazz, JSONArray dataValues) {
//创建返回对象集合
List<T> tList = new ArrayList<>();
// 遍历返回数据结构中的data.values
dataValues.forEach(dataValue -> {
// 单次循环的需要创建的对象
T t = null;
try {
t = clazz.newInstance();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
// 反射获取所有的字段数组
Field[] declaredFields = clazz.getDeclaredFields();
// 遍历所有的对象属性
for (Field declaredField : declaredFields) {
// 如果当前属性被BusColumnField注解修饰
if (declaredField.isAnnotationPresent(BusColumnField.class)) {
// 得到注解中的value值,其值对应着dataValues中的key列名
String field = declaredField.getAnnotation(BusColumnField.class).value();
// 将Object强转为JSONObject类型
JSONObject dataValueObject = (JSONObject) dataValue;
// 根据注解中的key取出返回数据中对应的数据
JSONObject fieldData = (JSONObject) dataValueObject.get(field);
// 如果取不到就继续判断下一个属性
if (fieldData == null) {
continue;
}
// 开启私有属性的可见性可操作性
declaredField.setAccessible(true);
try {
// 将code原值写入对应对象的对应属性中
declaredField.set(t, fieldData.get("code"));
} catch (IllegalAccessException e) {
e.printStackTrace();
}
}
}
tList.add(t);
});
return tList;
}
代码解读
Class对象
作用:在运行时,识别一个对象的类型和类的信息
使用场景:反射机制,允许在运行时发现和使用类型的信息,在java中用来表示运行时类型信息的对应类就是Class类
创建:
public class Test {
public static void main(String[] args) throws ClassNotFoundException {
//class对象创建的3种方法
//1、类名.class
Class<User> userClass1 = User.class;
System.out.println(userClass1);
//2、实例.getClass()
User user = new User();
Class userClass2 = user.getClass();
System.out.println(userClass2);
//3、Class.forName("类的全路径")
Class<?> user1 = Class.forName("User");
System.out.println(user1);
}
}
class User{
private String name;
private String age;
}
常用的方法:
//常用的方法
//1、getName()
String userClass1Name = user.getClass().getName();
System.out.println(userClass1Name);
//返回User
//2、newInstance() --创建一个实例-调用默认构造器(无参数构造器)初始化新建对象。
User user2 = user.getClass().newInstance();
//3、getClassLoader()---返回该类的类加载器
ClassLoader classLoader = user.getClass().getClassLoader();
// 4、getComponentType()---返回表示数组组件类型的 Class
// 5、getSuperclass()---返回表示此 Class 所表示的实体(类、接口、基本类型或 void)的超类的 Class。
// 6、isArray()---判定此 Class 对象是否表示一个数组类。
自定义注解:
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
@Documented
public @interface BusColumnField {
String value() default "";
}
我们的实体类的属性上 会加这个注解
@Data
public class Station {
/**
* 厂站ID
*/
@BusColumnField(value = "id")
private String id;
/**
* 厂站名称
*/
@BusColumnField(value = "name")
private String name;
/**
* 电压等级ID
*/
@BusColumnField(value = "volId")
private String volId;
/**
* 厂站所属调度机构ID
*/
@BusColumnField(value = "orgId")
private String orgId;
}
参考:
(84条消息) Java——深入理解Class对象(一):什么是Class对象_一只野生饭卡丘的博客-CSDN博客_class撖寡情
(84条消息) Class类简介——详述创建对象的两种方式之newInstance()方法_曼舞精灵的博客-CSDN博客_newinstance()方法