mirror of
https://gitee.com/mybatis-flex/mybatis-flex.git
synced 2025-12-08 01:28:24 +08:00
optimize: 优化抽取遍历父类的逻辑减少递归;
This commit is contained in:
parent
6ea5989c5f
commit
86f4358ebf
@ -591,22 +591,18 @@ public class TableInfoFactory {
|
||||
|
||||
|
||||
private static void doGetFields(Class<?> entityClass, List<Field> fields) {
|
||||
if (entityClass == null || entityClass == Object.class) {
|
||||
return;
|
||||
}
|
||||
|
||||
Field[] declaredFields = entityClass.getDeclaredFields();
|
||||
ClassUtil.applyAllClass(entityClass, currentClass -> {
|
||||
Field[] declaredFields = currentClass.getDeclaredFields();
|
||||
for (Field declaredField : declaredFields) {
|
||||
int modifiers = declaredField.getModifiers();
|
||||
if (Modifier.isStatic(modifiers)
|
||||
|| Modifier.isTransient(modifiers)
|
||||
|| existName(fields, declaredField)) {
|
||||
continue;
|
||||
}
|
||||
if (!Modifier.isStatic(modifiers)
|
||||
&& !Modifier.isTransient(modifiers)
|
||||
&& !existName(fields, declaredField)) {
|
||||
fields.add(declaredField);
|
||||
}
|
||||
|
||||
doGetFields(entityClass.getSuperclass(), fields);
|
||||
}
|
||||
return true;
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
|
||||
@ -234,12 +234,23 @@ public class ClassUtil {
|
||||
return fields.isEmpty() ? null : fields.get(0);
|
||||
}
|
||||
|
||||
private static void doGetFields(Class<?> clazz, List<Field> fields, Predicate<Field> predicate, boolean firstOnly) {
|
||||
if (clazz == null || clazz == Object.class) {
|
||||
return;
|
||||
/**
|
||||
* 应用类及其除Object外的所有父类
|
||||
*
|
||||
* @param clazz 需要应用的类
|
||||
* @param checkToContinue 应用当前类并检测是否继续应用, 返回false则停止应用, 返回true继续向上取父类
|
||||
* @author KAMOsama
|
||||
*/
|
||||
public static void applyAllClass(Class<?> clazz, Predicate<Class<?>> checkToContinue) {
|
||||
Class<?> currentClass = clazz;
|
||||
while (currentClass != null && currentClass != Object.class && checkToContinue.test(currentClass)) {
|
||||
currentClass = currentClass.getSuperclass();
|
||||
}
|
||||
}
|
||||
|
||||
Field[] declaredFields = clazz.getDeclaredFields();
|
||||
private static void doGetFields(Class<?> clazz, List<Field> fields, Predicate<Field> predicate, boolean firstOnly) {
|
||||
applyAllClass(clazz, currentClass -> {
|
||||
Field[] declaredFields = currentClass.getDeclaredFields();
|
||||
for (Field declaredField : declaredFields) {
|
||||
if (predicate == null || predicate.test(declaredField)) {
|
||||
fields.add(declaredField);
|
||||
@ -248,12 +259,9 @@ public class ClassUtil {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (firstOnly && !fields.isEmpty()) {
|
||||
return;
|
||||
}
|
||||
|
||||
doGetFields(clazz.getSuperclass(), fields, predicate, firstOnly);
|
||||
// 不止要获取第一个或集合为空就继续获取遍历父类
|
||||
return !firstOnly || fields.isEmpty();
|
||||
});
|
||||
}
|
||||
|
||||
public static List<Method> getAllMethods(Class<?> clazz) {
|
||||
@ -319,7 +327,6 @@ public class ClassUtil {
|
||||
doGetMethods(clazz.getSuperclass(), methods, predicate, firstOnly);
|
||||
}
|
||||
|
||||
|
||||
private static <T> Class<T> getJdkProxySuperClass(Class<T> clazz) {
|
||||
final Class<?> proxyClass = Proxy.getProxyClass(clazz.getClassLoader(), clazz.getInterfaces());
|
||||
return (Class<T>) proxyClass.getInterfaces()[0];
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user