From 77f2cedf76eb0567f8f7c2f2daabf85d7c12cf06 Mon Sep 17 00:00:00 2001 From: Looly Date: Thu, 5 May 2022 01:20:12 +0800 Subject: [PATCH] add methods --- .../cn/hutool/core/reflect/ClassUtil.java | 58 +++++++++++++++++++ .../cn/hutool/core/reflect/MethodUtil.java | 3 +- 2 files changed, 60 insertions(+), 1 deletion(-) diff --git a/hutool-core/src/main/java/cn/hutool/core/reflect/ClassUtil.java b/hutool-core/src/main/java/cn/hutool/core/reflect/ClassUtil.java index 42c041ac1..1d040b686 100644 --- a/hutool-core/src/main/java/cn/hutool/core/reflect/ClassUtil.java +++ b/hutool-core/src/main/java/cn/hutool/core/reflect/ClassUtil.java @@ -21,9 +21,11 @@ import java.lang.reflect.Type; import java.net.URI; import java.net.URL; import java.time.temporal.TemporalAccessor; +import java.util.ArrayList; import java.util.Date; import java.util.Enumeration; import java.util.HashSet; +import java.util.LinkedHashSet; import java.util.List; import java.util.Locale; import java.util.Set; @@ -686,4 +688,60 @@ public class ClassUtil { } return location.getPath(); } + + /** + * 获取指定类的所有父类,结果不包括指定类本身
+ * 如果无父类,返回一个空的列表 + * + * @param clazz 类, 可以为{@code null} + * @return 所有父类列表,参数为{@code null} 则返回{@code null} + */ + public static List> getSuperClasses(final Class clazz) { + if (clazz == null) { + return null; + } + final List> classes = new ArrayList<>(); + Class superclass = clazz.getSuperclass(); + while (superclass != null) { + classes.add(superclass); + superclass = superclass.getSuperclass(); + } + return classes; + } + + /** + * 获取指定类及其父类所有的实现接口。
+ * 结果顺序取决于查找顺序,当前类在前,父类的接口在后。 + * + * @param cls 被查找的类 + * @return 接口列表,若提供的查找类为{@code null},返回{@code null} + */ + public static List> getInterfaces(final Class cls) { + if (cls == null) { + return null; + } + + final LinkedHashSet> interfacesFound = new LinkedHashSet<>(); + getInterfaces(cls, interfacesFound); + + return new ArrayList<>(interfacesFound); + } + + /** + * 获取指定类的的接口列表 + * + * @param clazz 指定类 + * @param interfacesFound 接口Set + */ + private static void getInterfaces(Class clazz, final HashSet> interfacesFound) { + while (clazz != null) { + for (final Class i : clazz.getInterfaces()) { + if (interfacesFound.add(i)) { + getInterfaces(i, interfacesFound); + } + } + + clazz = clazz.getSuperclass(); + } + } } diff --git a/hutool-core/src/main/java/cn/hutool/core/reflect/MethodUtil.java b/hutool-core/src/main/java/cn/hutool/core/reflect/MethodUtil.java index 3e813f787..d5dffe169 100644 --- a/hutool-core/src/main/java/cn/hutool/core/reflect/MethodUtil.java +++ b/hutool-core/src/main/java/cn/hutool/core/reflect/MethodUtil.java @@ -21,7 +21,8 @@ import java.util.List; import java.util.Set; /** - * 反射中{@link Method}相关工具类,包括方法获取和方法执行 + * 反射中{@link Method}相关工具类,包括方法获取和方法执行
+ * TODO 与commons-beanutils相比,Hutool缓存某个类的所有方法,而commons缓存单个方法,须性能测试哪个更加合理。 * * @author looly */