From 80f973093c850f944c987b1a1c7d281ebf9b4087 Mon Sep 17 00:00:00 2001 From: LinRuChang <2329073340@qq.com> Date: Fri, 30 Sep 2022 11:36:30 +0800 Subject: [PATCH 1/2] =?UTF-8?q?=E6=B3=A8=E8=A7=A3=E5=B7=A5=E5=85=B7?= =?UTF-8?q?=E7=B1=BB=E6=94=AF=E6=8C=81Lambda=E8=8E=B7=E5=8F=96=E6=9F=90?= =?UTF-8?q?=E6=B3=A8=E8=A7=A3=E5=B1=9E=E6=80=A7=E5=80=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../core/annotation/AnnotationUtil.java | 22 +++++++++++++++++++ .../core/annotation/AnnotationForTest.java | 2 ++ .../core/annotation/AnnotationUtilTest.java | 9 +++++++- 3 files changed, 32 insertions(+), 1 deletion(-) diff --git a/hutool-core/src/main/java/cn/hutool/core/annotation/AnnotationUtil.java b/hutool-core/src/main/java/cn/hutool/core/annotation/AnnotationUtil.java index f16aeb605..1dd77aa40 100755 --- a/hutool-core/src/main/java/cn/hutool/core/annotation/AnnotationUtil.java +++ b/hutool-core/src/main/java/cn/hutool/core/annotation/AnnotationUtil.java @@ -7,6 +7,8 @@ import cn.hutool.core.annotation.scanner.TypeAnnotationScanner; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.exceptions.UtilException; import cn.hutool.core.lang.Opt; +import cn.hutool.core.lang.func.Func1; +import cn.hutool.core.lang.func.LambdaUtil; import cn.hutool.core.util.ArrayUtil; import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.ReflectUtil; @@ -229,6 +231,26 @@ public class AnnotationUtil { return ReflectUtil.invoke(annotation, method); } + /** + * 获取指定注解属性的值
+ * 如果无指定的属性方法返回null + * + * @param 注解类型 + * @param 注解类型值 + * @param annotationEle {@link AnnotatedElement},可以是Class、Method、Field、Constructor、ReflectPermission + * @param annotationType 注解类型 + * @param propertyName 属性名,例如注解中定义了name()方法,则 此处传入name + * @return 注解对象 + * @throws UtilException 调用注解中的方法时执行异常 + */ + public static R getAnnotationValue(AnnotatedElement annotationEle, Class annotationType, Func1 propertyName) { + if(propertyName == null) { + return null; + }else { + return getAnnotationValue(annotationEle,annotationType, LambdaUtil.getMethodName(propertyName)); + } + } + /** * 获取指定注解中所有属性值
* 如果无指定的属性方法返回null diff --git a/hutool-core/src/test/java/cn/hutool/core/annotation/AnnotationForTest.java b/hutool-core/src/test/java/cn/hutool/core/annotation/AnnotationForTest.java index f109e836d..2bbffc784 100755 --- a/hutool-core/src/test/java/cn/hutool/core/annotation/AnnotationForTest.java +++ b/hutool-core/src/test/java/cn/hutool/core/annotation/AnnotationForTest.java @@ -26,4 +26,6 @@ public @interface AnnotationForTest { @Alias("value") String retry() default ""; + + String[] names() default ""; } diff --git a/hutool-core/src/test/java/cn/hutool/core/annotation/AnnotationUtilTest.java b/hutool-core/src/test/java/cn/hutool/core/annotation/AnnotationUtilTest.java index 0e5803c1e..8ca83daca 100755 --- a/hutool-core/src/test/java/cn/hutool/core/annotation/AnnotationUtilTest.java +++ b/hutool-core/src/test/java/cn/hutool/core/annotation/AnnotationUtilTest.java @@ -1,5 +1,6 @@ package cn.hutool.core.annotation; +import cn.hutool.core.util.ArrayUtil; import cn.hutool.core.util.ReflectUtil; import org.junit.Assert; import org.junit.Test; @@ -34,6 +35,12 @@ public class AnnotationUtilTest { } + @Test + public void getAnnotationValueTest2() { + String[] names = AnnotationUtil.getAnnotationValue(ClassWithAnnotation.class, AnnotationForTest.class, AnnotationForTest::names); + Assert.assertTrue(ArrayUtil.equals(names, new String[]{"测试1", "测试2"})); + } + @Test public void getAnnotationSyncAlias() { // 直接获取 @@ -45,7 +52,7 @@ public class AnnotationUtilTest { Assert.assertTrue(AnnotationUtil.isSynthesizedAnnotation(annotation)); } - @AnnotationForTest("测试") + @AnnotationForTest(value = "测试", names = {"测试1", "测试2"}) @RepeatAnnotationForTest static class ClassWithAnnotation{ public void test(){ From 2c24738b2c490f6dc2af967629c482283696d8a3 Mon Sep 17 00:00:00 2001 From: LinRuChang <2329073340@qq.com> Date: Fri, 30 Sep 2022 12:32:35 +0800 Subject: [PATCH 2/2] =?UTF-8?q?=E6=B3=A8=E8=A7=A3=E5=B7=A5=E5=85=B7?= =?UTF-8?q?=E7=B1=BB=E6=94=AF=E6=8C=81Lambda=E8=8E=B7=E5=8F=96=E6=9F=90?= =?UTF-8?q?=E6=B3=A8=E8=A7=A3=E5=B1=9E=E6=80=A7=E5=80=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../cn/hutool/core/annotation/AnnotationUtil.java | 13 +++++++------ .../hutool/core/annotation/AnnotationUtilTest.java | 3 ++- 2 files changed, 9 insertions(+), 7 deletions(-) diff --git a/hutool-core/src/main/java/cn/hutool/core/annotation/AnnotationUtil.java b/hutool-core/src/main/java/cn/hutool/core/annotation/AnnotationUtil.java index 1dd77aa40..4c726d99e 100755 --- a/hutool-core/src/main/java/cn/hutool/core/annotation/AnnotationUtil.java +++ b/hutool-core/src/main/java/cn/hutool/core/annotation/AnnotationUtil.java @@ -9,11 +9,10 @@ import cn.hutool.core.exceptions.UtilException; import cn.hutool.core.lang.Opt; import cn.hutool.core.lang.func.Func1; import cn.hutool.core.lang.func.LambdaUtil; -import cn.hutool.core.util.ArrayUtil; -import cn.hutool.core.util.ObjectUtil; -import cn.hutool.core.util.ReflectUtil; +import cn.hutool.core.util.*; import java.lang.annotation.*; +import java.lang.invoke.SerializedLambda; import java.lang.reflect.AnnotatedElement; import java.lang.reflect.Method; import java.lang.reflect.Proxy; @@ -238,16 +237,18 @@ public class AnnotationUtil { * @param
注解类型 * @param 注解类型值 * @param annotationEle {@link AnnotatedElement},可以是Class、Method、Field、Constructor、ReflectPermission - * @param annotationType 注解类型 * @param propertyName 属性名,例如注解中定义了name()方法,则 此处传入name * @return 注解对象 * @throws UtilException 调用注解中的方法时执行异常 */ - public static R getAnnotationValue(AnnotatedElement annotationEle, Class annotationType, Func1 propertyName) { + public static R getAnnotationValue(AnnotatedElement annotationEle, Func1 propertyName) { if(propertyName == null) { return null; }else { - return getAnnotationValue(annotationEle,annotationType, LambdaUtil.getMethodName(propertyName)); + final SerializedLambda lambda = LambdaUtil.resolve(propertyName); + final String instantiatedMethodType = lambda.getInstantiatedMethodType(); + Class annotationClass = ClassUtil.loadClass(StrUtil.sub(instantiatedMethodType, 2, StrUtil.indexOf(instantiatedMethodType, ';'))); + return getAnnotationValue(annotationEle,annotationClass, lambda.getImplMethodName()); } } diff --git a/hutool-core/src/test/java/cn/hutool/core/annotation/AnnotationUtilTest.java b/hutool-core/src/test/java/cn/hutool/core/annotation/AnnotationUtilTest.java index 8ca83daca..83646e85b 100755 --- a/hutool-core/src/test/java/cn/hutool/core/annotation/AnnotationUtilTest.java +++ b/hutool-core/src/test/java/cn/hutool/core/annotation/AnnotationUtilTest.java @@ -1,5 +1,6 @@ package cn.hutool.core.annotation; +import cn.hutool.core.lang.Console; import cn.hutool.core.util.ArrayUtil; import cn.hutool.core.util.ReflectUtil; import org.junit.Assert; @@ -37,7 +38,7 @@ public class AnnotationUtilTest { @Test public void getAnnotationValueTest2() { - String[] names = AnnotationUtil.getAnnotationValue(ClassWithAnnotation.class, AnnotationForTest.class, AnnotationForTest::names); + String[] names = AnnotationUtil.getAnnotationValue(ClassWithAnnotation.class, AnnotationForTest::names); Assert.assertTrue(ArrayUtil.equals(names, new String[]{"测试1", "测试2"})); }