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"}));
}