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