!428 ReflectUtil中加入通过条件过滤选择属性

Merge pull request !428 from ZhouChuGang/v5-dev
This commit is contained in:
Looly
2021-10-08 10:07:21 +00:00
committed by Gitee

View File

@@ -15,13 +15,7 @@ import java.lang.reflect.AccessibleObject;
import java.lang.reflect.Constructor; import java.lang.reflect.Constructor;
import java.lang.reflect.Field; import java.lang.reflect.Field;
import java.lang.reflect.Method; import java.lang.reflect.Method;
import java.util.AbstractMap; import java.util.*;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
/** /**
* 反射工具类 * 反射工具类
@@ -188,6 +182,24 @@ public class ReflectUtil {
return FIELDS_CACHE.put(beanClass, allFields); return FIELDS_CACHE.put(beanClass, allFields);
} }
/**
* 获得一个类中所有满足条件的字段列表,包括其父类中的字段<br>
* 如果子类与父类中存在同名字段,则这两个字段同时存在,子类字段在前,父类字段在后。
*
* @param beanClass 类
* @param fieldFilter field过滤器过滤掉不需要的field
* @return 字段列表
* @throws SecurityException 安全检查异常
*/
public static Field[] getFields(Class<?> beanClass, Filter<Field> fieldFilter) throws SecurityException {
final Field[] fields = getFields(beanClass);
if (ArrayUtil.isEmpty(fields)) {
return fields;
}
return ArrayUtil.filter(fields, fieldFilter);
}
/** /**
* 获得一个类中所有字段列表,直接反射获取,无缓存<br> * 获得一个类中所有字段列表,直接反射获取,无缓存<br>
* 如果子类与父类中存在同名字段,则这两个字段同时存在,子类字段在前,父类字段在后。 * 如果子类与父类中存在同名字段,则这两个字段同时存在,子类字段在前,父类字段在后。
@@ -917,7 +929,7 @@ public class ReflectUtil {
} }
} }
if(method.isDefault()){ if (method.isDefault()) {
// 当方法是default方法时尤其对象是代理对象需使用句柄方式执行 // 当方法是default方法时尤其对象是代理对象需使用句柄方式执行
// 代理对象情况下调用method.invoke会导致循环引用执行最终栈溢出 // 代理对象情况下调用method.invoke会导致循环引用执行最终栈溢出
return MethodHandleUtil.invokeSpecial(obj, method, args); return MethodHandleUtil.invokeSpecial(obj, method, args);