From 86f4358ebf288ef9953d4a9d83d7340b5f6fb662 Mon Sep 17 00:00:00 2001 From: kamosama <837080904@qq.com> Date: Wed, 5 Jun 2024 11:20:09 +0800 Subject: [PATCH] =?UTF-8?q?optimize:=20=E4=BC=98=E5=8C=96=E6=8A=BD?= =?UTF-8?q?=E5=8F=96=E9=81=8D=E5=8E=86=E7=88=B6=E7=B1=BB=E7=9A=84=E9=80=BB?= =?UTF-8?q?=E8=BE=91=E5=87=8F=E5=B0=91=E9=80=92=E5=BD=92;?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../core/table/TableInfoFactory.java | 26 +++++------- .../com/mybatisflex/core/util/ClassUtil.java | 41 +++++++++++-------- 2 files changed, 35 insertions(+), 32 deletions(-) diff --git a/mybatis-flex-core/src/main/java/com/mybatisflex/core/table/TableInfoFactory.java b/mybatis-flex-core/src/main/java/com/mybatisflex/core/table/TableInfoFactory.java index 715cd9b9..d42b1b47 100644 --- a/mybatis-flex-core/src/main/java/com/mybatisflex/core/table/TableInfoFactory.java +++ b/mybatis-flex-core/src/main/java/com/mybatisflex/core/table/TableInfoFactory.java @@ -591,22 +591,18 @@ public class TableInfoFactory { private static void doGetFields(Class entityClass, List fields) { - if (entityClass == null || entityClass == Object.class) { - return; - } - - Field[] declaredFields = entityClass.getDeclaredFields(); - for (Field declaredField : declaredFields) { - int modifiers = declaredField.getModifiers(); - if (Modifier.isStatic(modifiers) - || Modifier.isTransient(modifiers) - || existName(fields, declaredField)) { - continue; + 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)) { + fields.add(declaredField); + } } - fields.add(declaredField); - } - - doGetFields(entityClass.getSuperclass(), fields); + return true; + }); } diff --git a/mybatis-flex-core/src/main/java/com/mybatisflex/core/util/ClassUtil.java b/mybatis-flex-core/src/main/java/com/mybatisflex/core/util/ClassUtil.java index a964a367..3fa98b0f 100644 --- a/mybatis-flex-core/src/main/java/com/mybatisflex/core/util/ClassUtil.java +++ b/mybatis-flex-core/src/main/java/com/mybatisflex/core/util/ClassUtil.java @@ -234,26 +234,34 @@ public class ClassUtil { return fields.isEmpty() ? null : fields.get(0); } - private static void doGetFields(Class clazz, List fields, Predicate 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> checkToContinue) { + Class currentClass = clazz; + while (currentClass != null && currentClass != Object.class && checkToContinue.test(currentClass)) { + currentClass = currentClass.getSuperclass(); } + } - Field[] declaredFields = clazz.getDeclaredFields(); - for (Field declaredField : declaredFields) { - if (predicate == null || predicate.test(declaredField)) { - fields.add(declaredField); - if (firstOnly) { - break; + private static void doGetFields(Class clazz, List fields, Predicate predicate, boolean firstOnly) { + applyAllClass(clazz, currentClass -> { + Field[] declaredFields = currentClass.getDeclaredFields(); + for (Field declaredField : declaredFields) { + if (predicate == null || predicate.test(declaredField)) { + fields.add(declaredField); + if (firstOnly) { + break; + } } } - } - - if (firstOnly && !fields.isEmpty()) { - return; - } - - doGetFields(clazz.getSuperclass(), fields, predicate, firstOnly); + // 不止要获取第一个或集合为空就继续获取遍历父类 + return !firstOnly || fields.isEmpty(); + }); } public static List getAllMethods(Class clazz) { @@ -319,7 +327,6 @@ public class ClassUtil { doGetMethods(clazz.getSuperclass(), methods, predicate, firstOnly); } - private static Class getJdkProxySuperClass(Class clazz) { final Class proxyClass = Proxy.getProxyClass(clazz.getClassLoader(), clazz.getInterfaces()); return (Class) proxyClass.getInterfaces()[0];