反射技術Get OR Set 多繼承模式子類和父類屬性,方法
阿新 • • 發佈:2021-01-26
反射技術Get OR Set 多繼承模式子類和父類屬性,方法
這些都是等一下會呼叫的工具類,具體入參說明都有註釋
import java.lang.reflect.Field;
import org.springframework.util.ReflectionUtils;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
/**
* @ClassName ReflectUtils
* @Description 反射方法支援多級繼承子父類方法以及屬性操作工具類
* @Author liyahui
* @Date 2021-1-14 10:58
* @Version 1.0
*/
public class ReflectUtils {
/**
* 獲取本類及其父類的屬性的方法
*
* @param obj 當前類物件
* @return 欄位陣列
*/
private static Field[] getAllFields(Object obj) {
Class clazz = obj.getClass();
List<Field> fieldList = new ArrayList<>();
while (clazz != null) {
fieldList.addAll(new ArrayList<>(Arrays.asList(clazz.getDeclaredFields())));
clazz = clazz.getSuperclass();
}
Field[] fields = new Field[fieldList.size()];
fieldList.toArray(fields);
return fields;
}
/**
* 根據欄位名稱以及Class物件,查詢欄位
*
* @param tar 欄位名稱
* @param clazz 物件
*/
public static Field getFiled(String tar, Class clazz) {
String error = null;
Field field = null;
while (clazz != null) {
try {
field = clazz.getDeclaredField(tar);
error = null;
break;
} catch (Exception e) {
clazz = clazz.getSuperclass();
error = e.getMessage();
}
}
if (error != null || field == null) {
throw new RuntimeException("無法獲取源欄位:" + tar);
}
return field;
}
/**
* 根據欄位名稱以及newInstance返回物件以及Class<?> 物件查詢值
*
* @param filedName 欄位名稱
* @param o newInstance返回物件
* @param clazz Class<?> 物件
*/
public static Object getValueByPropName(String filedName, Object o, Class clazz) {
Field field = getFiled(filedName, clazz);
field.setAccessible(true);
return org.springframework.util.ReflectionUtils.getField(field, o);
}
/**
* 根據反射機制set物件屬性
*
* @param tar 欄位名稱
* @param o newInstance返回物件
* @param val set的資料值
* @param clazz Class<?> 物件
*/
public static void setValueByPropName(String tar, Object o, Object val, Class clazz) {
Field field = getFiled(tar, clazz);
field.setAccessible(true);
ReflectionUtils.setField(field, o, val);
}
}
建立3個類,進行互相繼承A extends B, B extends C
編寫測試類進行測試
package com.example.manage.reflect;
import com.alibaba.fastjson.JSON;
import org.springframework.util.ReflectionUtils;
import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Date;
import java.util.List;
/**
* @ClassName ReflectDemo
* @Description 該反射方法支援多級繼承子父類方法以及屬性操作
* @Author liyahui
* @Date 2021-1-14 10:58
* @Version 1.0
*/
public class ReflectDemo {
public static void main(String[] args) {
reflectParent();
}
public static void reflectParent() {
Object instance = null;
Class<?> c = null;
try {
c = Class.forName("com.example.manage.reflect.A");
instance = c.newInstance();
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InstantiationException e) {
e.printStackTrace();
}
Field[] fields = getAllFields(instance);
for (int i = 0; i < fields.length; i++) {
String type = fields[i].getGenericType().toString();
switch (type) {
case "class java.lang.String":
setValueByPropName(fields[i].getName(), instance, "str", c);
break;
case "class java.lang.Integer":
setValueByPropName(fields[i].getName(), instance, 1, c);
break;
case "class java.lang.Boolean":
setValueByPropName(fields[i].getName(), instance, true, c);
break;
case "class java.lang.Long":
setValueByPropName(fields[i].getName(), instance, 2L, c);
break;
case "class java.util.Date":
setValueByPropName(fields[i].getName(), instance, new Date(), c);
break;
case "class java.lang.Double":
setValueByPropName(fields[i].getName(), instance, 1.0, c);
break;
default:
break;
}
}
System.out.println(JSON.toJSONString((A) instance));
}
/**
* 在這下面可以編寫呼叫資料庫操作的一些程式碼
* */
/************************************************/
// TODO: 2021-1-14 XXXMapper.save((A) instance);
/************************************************/
}