Java利用反射进行对象赋值与类型转换
首先利用反射创建目标类对象,获取当前对象以及目标类所有的成员,然后对这些属性双层循环遍历比较变量名,变量名称相等则进行赋值。
获取成员属性时注意点:class.getDeclaredFields()能获取所有属性(public、protected、default、private),但不包括父类属性,相对的class.getFields() 获取类的属性(public),包括父类;
这两者并不能满足我们的需求,我们需要的是要获取到子类以及父类的所有权限属性(public、protected、default、private)
代码如下:
首先测试类父类:
public class User {
private Long id;
private String name;
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
子类:
public class VipUser extends User {
private String code;
public String getCode() {
return code;
}
public void setCode(String code) {
this.code = code;
}
}
另一种类型的测试类:
public class Person {
private String name;
private Integer age;
public Person() {
}
public Person(String name, Integer age) {
this.name = name;
this.age = age;
}
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;
}
@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}
主类:
package com.study.multisource.test;
import com.study.multisource.entity.Person;
import com.study.multisource.entity.VipUser;
import java.lang.reflect.Field;
import java.lang.reflect.Modifier;
import java.util.ArrayList;
import java.util.List;
/**
* @date 2020/6/4 14:33
*/
public class ObjectUtil {
/**
* 对象转化
*
* @param source
* @param targetClazz
* @return
* @throws InstantiationException
* @throws IllegalAccessException
*/
public static Object objToObj(Object source, Class<?> targetClazz) throws InstantiationException, IllegalAccessException {
Object target = targetClazz.newInstance();
Class sourceClazz = source.getClass();
Field[] sourceFields = getAllFields(sourceClazz);
Field[] targetFields = getAllFields(targetClazz);
for (Field sourceField : sourceFields) {
sourceField.setAccessible(true);
for (Field targetField : targetFields) {
if (targetField.getName().equals(sourceField.getName()) && targetField.getType() == sourceField.getType()) {
int mod = targetField.getModifiers();
if (Modifier.isStatic(mod) || Modifier.isFinal(mod)) {
continue;
}
targetField.setAccessible(true);
targetField.set(target, sourceField.get(source));
break;
}
}
}
return target;
}
public static Field[] getAllFields(final Class<?> cls) {
final List<Field> allFieldsList = getAllFieldsList(cls);
return allFieldsList.toArray(new Field[allFieldsList.size()]);
}
public static List<Field> getAllFieldsList(final Class<?> cls) {
final List<Field> allFields = new ArrayList<Field>();
Class<?> currentClass = cls;
while (currentClass != null) {
final Field[] declaredFields = currentClass.getDeclaredFields();
for (final Field field : declaredFields) {
allFields.add(field);
}
currentClass = currentClass.getSuperclass();
}
return allFields;
}
public static void main(String[] args) {
VipUser vipUser = new VipUser();
vipUser.setCode("101");
vipUser.setName("Liu");
vipUser.setId(1L);
try {
//可以进行对象深拷贝
VipUser vipUser2 = (VipUser)objToObj(vipUser,VipUser.class);
System.out.println("用户2改名前 : " + vipUser2.getName());
vipUser2.setName("Mao");
System.out.println("用户1 : " + vipUser.getName());
System.out.println("用户2改名后 : " + vipUser2.getName());
//可以转化为别的类型
Person p = (Person)objToObj(vipUser, Person.class);
System.out.println("Person : " + p.getName());
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
}
}
结果:
用户2改名前 : Liu
用户1 : Liu
用户2改名后 : Mao
Person : Liu