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) {
|
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);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@ -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];
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user