Java基本原理__03_反射 (Reflect)
反射的应用案例:
通过反射直接给对象赋值
演示案例 演示工程目录结构
User.java
package com.dk.developer.bean;
import java.io.Serializable;
public class User implements Serializable {
private String name;
private Integer age;
private String createTime;
private String createUser;
private String updateTime;
private String updateUser;
// get set 方法 ...
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public String getCreateTime() {
return createTime;
}
public void setCreateTime(String createTime) {
this.createTime = createTime;
}
public String getCreateUser() {
return createUser;
}
public void setCreateUser(String createUser) {
this.createUser = createUser;
}
public String getUpdateTime() {
return updateTime;
}
public void setUpdateTime(String updateTime) {
this.updateTime = updateTime;
}
public String getUpdateUser() {
return updateUser;
}
public void setUpdateUser(String updateUser) {
this.updateUser = updateUser;
}
@Override
public String toString() {
return "User [name=" + name + ", age=" + age + ", createTime=" + createTime + ", createUser=" + createUser
+ ", updateTime=" + updateTime + ", updateUser=" + updateUser + "]";
}
}
Admin.java
package com.dk.developer.bean;
public class Admin {
private String id;
private Double number;
private User user;
private int code;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public Double getNumber() {
return number;
}
public void setNumber(Double number) {
this.number = number;
}
public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
}
public int getCode() {
return code;
}
public void setCode(int code) {
this.code = code;
}
@Override
public String toString() {
return "Admin [id=" + id + ", number=" + number + ", user=" + user + ", code=" + code + "]";
}
}
BeanUtil.java
package com.dk.developer.bean;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.List;
import com.dk.developer.string.StringUtil;
public class BeanUtil {
/**
* 通过反射直接给对象赋值
* @param obj
* @param values
* @return
*/
public static Object transBean(Object obj,List<Object> values) {
Field[] flds = obj.getClass().getDeclaredFields();
int index = 0;
for(Field f:flds){
setVal(obj,"set"+StringUtil.upperCase(f.getName()),f.getType(),values.get(index));
index++;
}
return obj;
}
public static void setVal(Object obj, String methodName,Class<?> Type, Object val) {
Class clazz = obj.getClass();
Method method = null;
try {
method = clazz.getMethod(methodName, Type);
method.invoke(obj, val);
System.out.println(Type);
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 测试通过反射创建任意对象
* @param args
*/
public static void main(String[] args) {
List<Object> list =new ArrayList<Object>();
list.add("JACK");
list.add(20);
list.add("2018-01-01");
list.add("jimmy");
list.add("2008-08-08");
list.add("David");
Object obj = transBean(new User(),list);
System.out.println(obj);
List<Object> list1 =new ArrayList<Object>();
list1.add("1");
list1.add(2.3);
list1.add(obj);
list1.add(23);
Object obj1 = transBean(new Admin(),list1);
System.out.println(obj1);
}
}
TestClass.java
package com.dk.developer.bean;
import java.beans.IntrospectionException;
import java.beans.PropertyDescriptor;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
public class TestClass {
public static void main(String[] args) throws IntrospectionException, InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException {
User entity = User.class.newInstance();
Field[] flds = entity.getClass().getDeclaredFields();
for(Field f:flds){
PropertyDescriptor propertyDescriptor = new PropertyDescriptor(f.getName(), User.class);
// 得到了属性的类型. 为了转换 基本数据类型 和日期类型,等等非字符串类型
Class aClassType = propertyDescriptor.getPropertyType();
Method method = propertyDescriptor.getWriteMethod();
if (aClassType.equals(Integer.class)) {// 以此类推
method.invoke(entity, Integer.parseInt("12"));
} else {
method.invoke(entity, "345");
}
}
System.out.println(entity.toString());
}
}
运行TestClas中main方法测试:
总结:本案例重点要掌握的知识点
- newInstance
- getDeclaredFields
- PropertyDescriptor
- getPropertyType
- getWriteMethod
- invoke