通过反射和泛型实例化对象,并给对象中的属性赋值
UserInfo.java
package bean;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.ToString;
@Data
@AllArgsConstructor
@NoArgsConstructor
@ToString
public class UserInfo {
private String username;
private Integer age;
private String address;
}
GenericTemplateTest.java
实例化对象,并使用三种方式给对象中的属性赋值
import bean.UserInfo;
import org.apache.commons.beanutils.BeanUtils;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.lang.reflect.Parameter;
import java.util.HashMap;
import java.util.Map;
/**
* 泛型模板测试
*/
public class GenericTemplateTest {
public static void main(String[] args) throws InstantiationException, IllegalAccessException, InvocationTargetException {
Map<String, Object> valuesMap = new HashMap<>();
valuesMap.put("id", 1L);
valuesMap.put("username", "zhangsan");
valuesMap.put("age", 17);
valuesMap.put("address", "beijing");
ReflectionClass<UserInfo> reflectionClass = new ReflectionClass<>();
UserInfo userInfo = reflectionClass.instanceClass(UserInfo.class);
// reflectionClass.setFields1(userInfo, UserInfo.class, valuesMap);
// reflectionClass.setFields2(userInfo, UserInfo.class, valuesMap);
reflectionClass.setFields3(userInfo, valuesMap);
System.out.println(userInfo.toString());
}
}
class ReflectionClass<T> {
/**
* 实例化对象
* @param cls 待实例化对象的类
*/
public T instanceClass(Class<T> cls) throws InstantiationException, IllegalAccessException {
T t = cls.newInstance();
for (Field declaredField : cls.getDeclaredFields()) {
System.out.println(declaredField.getName());
}
System.out.println("--- 方法 ---");
Method[] methods = cls.getMethods();
for(Method method:methods){
System.out.println("方法:" + method.getName());
Parameter[] parameters = method.getParameters();
for (Parameter parameter : parameters) {
System.out.println(parameter.getName() + " --- " + parameter.getType() + " --- " + parameter.getParameterizedType());
}
System.out.println("返回值类型:" + method.getReturnType());
}
return t;
}
/**
* 给属性赋值,使用 Field.set() 方法给每个属性赋值
*/
public void setFields1(T t, Class<T> cls, Map<String, Object> valuesMap) throws InvocationTargetException, IllegalAccessException {
for (Field declaredField : cls.getDeclaredFields()) {
declaredField.setAccessible(true);
declaredField.set(t, valuesMap.get(declaredField.getName()));
}
}
/**
* 给属性赋值,使用 BeanUtils.setProperty() 方法给每个属性赋值
*/
public void setFields2(T t, Class<T> cls, Map<String, Object> valuesMap) throws InvocationTargetException, IllegalAccessException {
for (Field declaredField : cls.getDeclaredFields()) {
BeanUtils.setProperty(t, declaredField.getName(), valuesMap.get(declaredField.getName()));
}
}
/**
* 给属性赋值,使用 BeanUtils.populate() 给与 map 中对应的属性名称赋值
*/
public void setFields3(T t, Map<String, Object> valuesMap) throws InvocationTargetException, IllegalAccessException {
BeanUtils.populate(t, valuesMap);
}
}
执行后,在 console 输出:
username
age
address
--- 方法 ---
方法:equals
arg0 --- class java.lang.Object --- class java.lang.Object
返回值类型:boolean
方法:toString
返回值类型:class java.lang.String
方法:hashCode
返回值类型:int
方法:getAddress
返回值类型:class java.lang.String
方法:setAddress
arg0 --- class java.lang.String --- class java.lang.String
返回值类型:void
方法:getAge
返回值类型:class java.lang.Integer
方法:setAge
arg0 --- class java.lang.Integer --- class java.lang.Integer
返回值类型:void
方法:getUsername
返回值类型:class java.lang.String
方法:setUsername
arg0 --- class java.lang.String --- class java.lang.String
返回值类型:void
方法:wait
返回值类型:void
方法:wait
arg0 --- long --- long
arg1 --- int --- int
返回值类型:void
方法:wait
arg0 --- long --- long
返回值类型:void
方法:getClass
返回值类型:class java.lang.Class
方法:notify
返回值类型:void
方法:notifyAll
返回值类型:void
UserInfo(username=zhangsan, age=17, address=beijing)