diff --git a/mybatis-flex-core/src/main/java/com/mybatisflex/core/handler/CompositeEnumTypeHandler.java b/mybatis-flex-core/src/main/java/com/mybatisflex/core/handler/CompositeEnumTypeHandler.java index f8dac188..3f86529e 100644 --- a/mybatis-flex-core/src/main/java/com/mybatisflex/core/handler/CompositeEnumTypeHandler.java +++ b/mybatis-flex-core/src/main/java/com/mybatisflex/core/handler/CompositeEnumTypeHandler.java @@ -39,8 +39,8 @@ public class CompositeEnumTypeHandler> implements TypeHandler< boolean isNotFound = false; List enumDbValueFields = ClassUtil.getAllFields(enumClass, f -> f.getAnnotation(EnumValue.class) != null); if (enumDbValueFields.isEmpty()) { - List enumDbValueMethods = ClassUtil.getAllMethods(enumClass, m -> m.getAnnotation(EnumValue.class) != null); - if (enumDbValueMethods.isEmpty()) { + Method enumDbValueMethod = ClassUtil.getFirstMethodByAnnotation(enumClass, EnumValue.class); + if (enumDbValueMethod == null) { isNotFound = true; } } diff --git a/mybatis-flex-core/src/main/java/com/mybatisflex/core/handler/FlexEnumTypeHandler.java b/mybatis-flex-core/src/main/java/com/mybatisflex/core/handler/FlexEnumTypeHandler.java index ce19d093..303a0e46 100644 --- a/mybatis-flex-core/src/main/java/com/mybatisflex/core/handler/FlexEnumTypeHandler.java +++ b/mybatis-flex-core/src/main/java/com/mybatisflex/core/handler/FlexEnumTypeHandler.java @@ -26,7 +26,7 @@ import java.sql.SQLException; public class FlexEnumTypeHandler> extends BaseTypeHandler { - private EnumWrapper enumWrapper; + private final EnumWrapper enumWrapper; public FlexEnumTypeHandler(Class enumClass) { enumWrapper = EnumWrapper.of(enumClass); 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 67f52d13..3ea9007a 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 @@ -18,10 +18,9 @@ package com.mybatisflex.core.util; import org.apache.ibatis.javassist.util.proxy.ProxyObject; +import java.lang.annotation.Annotation; import java.lang.reflect.*; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; +import java.util.*; import java.util.function.Predicate; /** @@ -241,7 +240,7 @@ public class ClassUtil { * @param checkToContinue 应用当前类并检测是否继续应用, 返回false则停止应用, 返回true继续向上取父类 * @author KAMOsama */ - public static void applyAllClass(Class clazz, Predicate> checkToContinue) { + public static void applyAllClass(Class clazz, Predicate> checkToContinue) { Class currentClass = clazz; while (currentClass != null && currentClass != Object.class && checkToContinue.test(currentClass)) { currentClass = currentClass.getSuperclass(); @@ -286,6 +285,34 @@ public class ClassUtil { return methods.isEmpty() ? null : methods.get(0); } + public static Method getFirstMethodByAnnotation(Class clazz, Class annotationClass) { + Set> visited = new HashSet<>(); + return findMethod(clazz, annotationClass, visited); + } + + private static Method findMethod(Class clazz, Class annotationClass, Set> visited) { + if (clazz == null || clazz == Object.class || visited.contains(clazz)) { + return null; + } + visited.add(clazz); + + Method[] methods = clazz.getDeclaredMethods(); + for (Method method : methods) { + if (method.isAnnotationPresent(annotationClass)) { + return method; + } + } + + for (Class inter : clazz.getInterfaces()) { + Method method = findMethod(inter, annotationClass, visited); + if (method != null) { + return method; + } + } + + return findMethod(clazz.getSuperclass(), annotationClass, visited); + } + private static void doGetMethods(Class clazz, List methods, Predicate predicate, boolean firstOnly) { applyAllClass(clazz, currentClass -> { @@ -318,7 +345,7 @@ public class ClassUtil { for (Class anInterface : interfaces) { doGetMethods(anInterface, methods, predicate, firstOnly); // 只获取第一个并且集合不为空就结束遍历 - if (firstOnly && !methods.isEmpty()){ + if (firstOnly && !methods.isEmpty()) { return false; } } diff --git a/mybatis-flex-core/src/main/java/com/mybatisflex/core/util/EnumWrapper.java b/mybatis-flex-core/src/main/java/com/mybatisflex/core/util/EnumWrapper.java index d8d5c613..2afb354d 100644 --- a/mybatis-flex-core/src/main/java/com/mybatisflex/core/util/EnumWrapper.java +++ b/mybatis-flex-core/src/main/java/com/mybatisflex/core/util/EnumWrapper.java @@ -30,8 +30,8 @@ public class EnumWrapper> { private boolean hasEnumValueAnnotation = false; - private Class enumClass; - private E[] enums; + private final Class enumClass; + private final E[] enums; private Field property; private Class propertyType; private Method getterMethod; @@ -71,7 +71,7 @@ public class EnumWrapper> { } if (!hasEnumValueAnnotation) { - Method enumValueMethod = ClassUtil.getFirstMethod(enumClass, method -> method.getAnnotation(EnumValue.class) != null); + Method enumValueMethod = ClassUtil.getFirstMethodByAnnotation(enumClass, EnumValue.class); if (enumValueMethod != null) { String methodName = enumValueMethod.getName(); if (!(methodName.startsWith("get") && methodName.length() > 3)) { @@ -102,11 +102,11 @@ public class EnumWrapper> { try { if (getterMethod != null) { return getterMethod.invoke(object); - } else if(property != null){ + } else if (property != null) { return property.get(object); } else { //noinspection unchecked - return ((E)object).name(); + return ((E) object).name(); } } catch (Exception e) { throw FlexExceptions.wrap(e); diff --git a/mybatis-flex-test/mybatis-flex-native-test/src/main/java/com/mybatisflex/test/IBaseEnum.java b/mybatis-flex-test/mybatis-flex-native-test/src/main/java/com/mybatisflex/test/IBaseEnum.java new file mode 100644 index 00000000..d649a154 --- /dev/null +++ b/mybatis-flex-test/mybatis-flex-native-test/src/main/java/com/mybatisflex/test/IBaseEnum.java @@ -0,0 +1,8 @@ +package com.mybatisflex.test; + +import com.mybatisflex.annotation.EnumValue; + +public interface IBaseEnum { + @EnumValue + int getCode(); +} diff --git a/mybatis-flex-test/mybatis-flex-native-test/src/main/java/com/mybatisflex/test/SexEnum.java b/mybatis-flex-test/mybatis-flex-native-test/src/main/java/com/mybatisflex/test/SexEnum.java index cd0ea018..bc8e62d3 100644 --- a/mybatis-flex-test/mybatis-flex-native-test/src/main/java/com/mybatisflex/test/SexEnum.java +++ b/mybatis-flex-test/mybatis-flex-native-test/src/main/java/com/mybatisflex/test/SexEnum.java @@ -18,7 +18,7 @@ package com.mybatisflex.test; import com.mybatisflex.annotation.EnumValue; -public enum SexEnum { +public enum SexEnum implements IBaseEnum{ TYPE1(0, "女"), TYPE2(1, "男"), TYPE3(2, "未知"), @@ -35,7 +35,7 @@ public enum SexEnum { this.desc = desc; } - @EnumValue +// @EnumValue public int getCode() { return code; }