optimize: 优化抽取遍历父类的逻辑减少递归;

This commit is contained in:
kamosama 2024-06-05 11:20:09 +08:00
parent 6ea5989c5f
commit 86f4358ebf
2 changed files with 35 additions and 32 deletions

View File

@ -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;
});
}

View File

@ -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];