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) { private static void doGetFields(Class<?> entityClass, List<Field> fields) {
if (entityClass == null || entityClass == Object.class) { ClassUtil.applyAllClass(entityClass, currentClass -> {
return; Field[] declaredFields = currentClass.getDeclaredFields();
} for (Field declaredField : declaredFields) {
int modifiers = declaredField.getModifiers();
Field[] declaredFields = entityClass.getDeclaredFields(); if (!Modifier.isStatic(modifiers)
for (Field declaredField : declaredFields) { && !Modifier.isTransient(modifiers)
int modifiers = declaredField.getModifiers(); && !existName(fields, declaredField)) {
if (Modifier.isStatic(modifiers) fields.add(declaredField);
|| Modifier.isTransient(modifiers) }
|| existName(fields, declaredField)) {
continue;
} }
fields.add(declaredField); return true;
} });
doGetFields(entityClass.getSuperclass(), fields);
} }

View File

@ -234,26 +234,34 @@ public class ClassUtil {
return fields.isEmpty() ? null : fields.get(0); 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) { * 应用类及其除Object外的所有父类
return; *
* @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) {
for (Field declaredField : declaredFields) { applyAllClass(clazz, currentClass -> {
if (predicate == null || predicate.test(declaredField)) { Field[] declaredFields = currentClass.getDeclaredFields();
fields.add(declaredField); for (Field declaredField : declaredFields) {
if (firstOnly) { if (predicate == null || predicate.test(declaredField)) {
break; fields.add(declaredField);
if (firstOnly) {
break;
}
} }
} }
} // 不止要获取第一个或集合为空就继续获取遍历父类
return !firstOnly || fields.isEmpty();
if (firstOnly && !fields.isEmpty()) { });
return;
}
doGetFields(clazz.getSuperclass(), fields, predicate, firstOnly);
} }
public static List<Method> getAllMethods(Class<?> clazz) { public static List<Method> getAllMethods(Class<?> clazz) {
@ -319,7 +327,6 @@ public class ClassUtil {
doGetMethods(clazz.getSuperclass(), methods, predicate, firstOnly); doGetMethods(clazz.getSuperclass(), methods, predicate, firstOnly);
} }
private static <T> Class<T> getJdkProxySuperClass(Class<T> clazz) { private static <T> Class<T> getJdkProxySuperClass(Class<T> clazz) {
final Class<?> proxyClass = Proxy.getProxyClass(clazz.getClassLoader(), clazz.getInterfaces()); final Class<?> proxyClass = Proxy.getProxyClass(clazz.getClassLoader(), clazz.getInterfaces());
return (Class<T>) proxyClass.getInterfaces()[0]; return (Class<T>) proxyClass.getInterfaces()[0];