泛型,创建对象方式,反射获取泛型对象的方法和属性
- Java中创建对象的5种方式 ♻
- Java泛型:类型擦除
- List作为泛型参数实现可接收存储任意类型的List对象
- 这里需要说明的是:T ,R 或者 E都是自定义泛型,可以接受任意类型的参数,但只能接受一种,eg:T 传参了Person ,那么T就是Person,第二个参数就不能再用T去接收Car对象。
package com.jx.blogap1.utils;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils;
import java.lang.reflect.Constructor;
import java.util.ArrayList;
import java.util.List;
@Slf4j
public class Copy {
public static T copyPojoToVo(E pojo, T objectVo) {
BeanUtils.copyProperties(pojo, objectVo);
return objectVo;
}
//pojo 转 vo ,param 转 vo ,还可以添加一个param转 pojo
public static E copyParamToPojo(R params, E pojo) {
BeanUtils.copyProperties(params, pojo);
return pojo;
}
public static List copyList(List pojoList, List voList, T vo) {
for (int i = 0; i < pojoList.size(); i++) {
voList.add(Copy.copyPojoToVo(pojoList.get(i),vo));
}
return voList;
}
public static List copyList(List pojoList,List voList, Class typeT) {
try {
Constructor constructorT = typeT.getConstructor();
T vo = constructorT.newInstance();
for (int i = 0; i < pojoList.size(); i++) {
voList.add(Copy.copyPojoToVo(pojoList.get(i), vo));
}
return voList;
} catch (Exception e) {
log.error("copyList异常",e);
return null;
}
}
public static List copyList(List pojoList, Class typeT) {
try {
Constructor constructorT = typeT.getConstructor();
List voList = new ArrayList<>();
for (int i = 0; i < pojoList.size(); i++) {
T vo = constructorT.newInstance();
voList.add(Copy.copyPojoToVo(pojoList.get(i), vo));
}
return voList;
} catch (Exception e) {
log.error("copyList异常",e);
return null;
}
}
}
- 通过反射获得object对象对应的实体类的属性、及属性值
public static void testList2(List list){
for (Object object:list) {
System.out.println(object.toString());
//通过反射获得object对象对应的实体类的属性、及属性值
try{
//获得object对象对应的所有已申明的属性,包括public、private、和protected
Field [] fields = object.getClass().getDeclaredFields();
for (Field field:fields) {
//不加这一句 private的属性无法访问的呀
field.setAccessible(true);
//获得属性名称
System.out.println("获得属性名:"+ field.getName());
//获得属性值
System.out.println("获得属性值:"+ field.get(object));
}
}catch (Exception e){
e.printStackTrace();
}
//参考博主反射连接:https://blog.csdn.net/lotusyangjun/article/details/51957374
// end---------------------> 这里是我测试一下反射的使用的,不用请忽略
}
}
- Class.newInstance() 和 Constructor.newInstance() 的区别
从名称上看,这两种方法看起来一样,但它们之间存在差异 (详细代码显示见上述1.中)
- Class.newInstance()只能调用无参数构造函数,Constructor.newInstance()可以调用任何构造函数,而不管参数的数量.
- Class.newInstance()要求构造函数是可见的,Constructor.newInstance()在某些情况下也可以调用私有构造函数。
- Class.newInstance()抛出构造函数抛出的任何异常(已检查或未检查),Constructor.newInstance()始终使用InvocationTargetException 包装抛出的异常。