问题描述
如果我有这样的功能,
public void park( List< @myNote("list") List< @myNote("integer") Integer>> l){ System.out.println("park"); }
如果我使用Parameter.getAnnotations()和Paramter.getDeclaredAnnotation,则只能获取@myNote("list").有什么方法可以获取批注@myNote("integer")?
If I use Parameter.getAnnotations() and Paramter.getDeclaredAnnotation, I can only get @myNote("list"). Are any ways to get the annotation @myNote("integer")?
这可能与
推荐答案
以下是用于打印注释的代码,因此您可以看到在反射API中可以找到它们的位置.
Here is code to print the annotations, so you can see where in the reflection API they can be found.
基本上,您调用 param.getAnnotatedType()
,检查 AnnotatedType
是 AnnotatedParameterizedType
,然后调用 getAnnotatedActualTypeArguments()
来获取泛型类型参数,然后递归执行.
Basically, you call param.getAnnotatedType()
, check if the AnnotatedType
is an AnnotatedParameterizedType
, and call getAnnotatedActualTypeArguments()
to get the generic type arguments, and do that recursively.
对于每个AnnotatedType
(顶级或嵌套),您调用 getDeclaredAnnotations()
或 getAnnotations()
以获得该类型的注释.
For each AnnotatedType
, top-level or nested, you call getDeclaredAnnotations()
or getAnnotations()
to get the annotations on that type.
我添加了其他内容,以便您可以了解其工作原理.
I added extra stuff, just so you can see how it works.
public class Test {
public static void main(String[] args) {
Method method = Test.class.getDeclaredMethod("park", List.class, Map.class);
for (Parameter param : method.getParameters()) {
System.out.println("Parameter: " + param);
printAnnotatedType(1, param.getAnnotatedType());
}
}
static void printAnnotatedType(int indent, AnnotatedType type) {
System.out.println(" ".repeat(indent) + "AnnotatedType: " + type);
System.out.println(" ".repeat(indent + 2) + "Type: " + type.getType());
for (Annotation annotation : type.getDeclaredAnnotations()) {
System.out.println(" ".repeat(indent + 2) + "Annotation: " + annotation);
}
if (type instanceof AnnotatedParameterizedType) {
AnnotatedParameterizedType pt = (AnnotatedParameterizedType) type;
for (AnnotatedType typeArg : pt.getAnnotatedActualTypeArguments()) {
printAnnotatedType(indent + 1, typeArg);
}
}
}
public void park(@myNote("p0") List< @myNote("list") List< @myNote("integer") @myOther Integer>> l,
@myNote("p1") Map< @myNote("key") Long, @myNote("value") String> m) {
System.out.println("park");
}
}
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE_USE)
@interface myNote {
String value();
}
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE_USE)
@interface myOther {
}
输出
Parameter: java.util.List<java.util.List<java.lang.Integer>> arg0
AnnotatedType: @myNote(value="p0") java.util.List<@myNote(value="list") java.util.List<@myNote(value="integer") @myOther() java.lang.Integer>>
Type: java.util.List<java.util.List<java.lang.Integer>>
Annotation: @myNote(value="p0")
AnnotatedType: @myNote(value="list") java.util.List<@myNote(value="integer") @myOther() java.lang.Integer>
Type: java.util.List<java.lang.Integer>
Annotation: @myNote(value="list")
AnnotatedType: @myNote(value="integer") @myOther() java.lang.Integer
Type: class java.lang.Integer
Annotation: @myNote(value="integer")
Annotation: @myOther()
Parameter: java.util.Map<java.lang.Long, java.lang.String> arg1
AnnotatedType: @myNote(value="p1") java.util.Map<@myNote(value="key") java.lang.Long, @myNote(value="value") java.lang.String>
Type: java.util.Map<java.lang.Long, java.lang.String>
Annotation: @myNote(value="p1")
AnnotatedType: @myNote(value="key") java.lang.Long
Type: class java.lang.Long
Annotation: @myNote(value="key")
AnnotatedType: @myNote(value="value") java.lang.String
Type: class java.lang.String
Annotation: @myNote(value="value")
这篇关于如何在嵌套参数parameter中获取批注?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!