Java 如何访问方法参数的泛型类型参数的注释?

Java 如何访问方法参数的泛型类型参数的注释?,java,generics,reflection,annotations,java-11,Java,Generics,Reflection,Annotations,Java 11,假设我想使用反射检查以下类: class Foo { void bar(List<@Important String> b) {} } class-Foo{ 空栏(列表b){} } 请注意,@Important注释不在参数本身上(然后我可以使用方法.getParameterAnnotations()),而是在其类型参数上(当注释声明为具有元素类型.type\u use时允许使用) 有没有办法在Java11中读取这样的注释;DR-查看类型参数、类型变量和类型参数之间的答案

假设我想使用反射检查以下类:

class Foo {
   void bar(List<@Important String> b) {}
}
class-Foo{
空栏(列表b){}
}
请注意,
@Important
注释不在参数本身上(然后我可以使用
方法.getParameterAnnotations()
),而是在其类型参数上(当注释声明为具有
元素类型.type\u use
时允许使用)

有没有办法在Java11中读取这样的注释;DR-查看类型参数、类型变量和类型参数之间的答案


冗长的版本

“请注意,
@重要的
注释在其类型参数上…”

在您的
Foo
声明中

class-Foo{
空栏(列表b){}
}
String
不是。也不是。在您的代码段中,
String

虽然我在类型参数不能有注释()上得到了纠正,但为了保持谦虚,我将把这些JLS产品留在这里



类型参数可以是引用类型或通配符。通配符很有用 在只需要部分了解类型参数的情况下。

类型参数:



TypeArgumentList:



TypeArgument:




通配符:



通配符边界:

扩展

super

为完整起见,JLS生产的类型参数



类型变量是在类、接口、方法和构造函数体中用作类型的非限定标识符。

类型变量由泛型类、接口、方法或构造函数的类型参数的声明引入…

TypeParameter:

{TypeParameterModifier}TypeIdentifier[TypeBound]:


TypeParameterModifier:

   


尽管直到今天,我还从未在野外看到过一个,但之前的JLS产品证实了代码片段中带注释的
字符串
类型参数确实是合法的Java。每天都要学习一些新的东西!

不幸的是,反射API的这一部分很糟糕。基本类型没有必要的属性查询方法,并且没有访问者API或类似的方法。因此,任何试图进行全面自省的代码都别无选择,只能执行大量的
实例检查,以处理所有可能的情况

如果您事先知道该方法的类型应该是参数化类型,并且只想检查其第一个类型参数的注释,则可以简单一点,忽略所有其他可能的情况:

import java.lang.annotation.*;
导入java.lang.reflect.AnnotatedParameterizedType;
导入java.lang.reflect.Method;
导入java.util.*;
公共班机{
公共静态void main(字符串[]args)引发NoSuchMethodException{
方法m=Foo.class.getDeclaredMethod(“bar”,List.class);
var at=m.getAnnotatedParameterTypes()[0];
var ata=((AnnotatedParameterizedType)at).getAnnotatedActualTypeArguments()[0];
//获取所有注释
for(var a:ata.getAnnotations()){
系统输出打印项次(a);
}
//或者检查是否存在已知注释
System.out.println(ata.getAnnotation(Important.class)!=null);
}
福班{
空栏(列表b){}
}
}

@Important()
真的

不确定我的问题是否正确,但如果您可以访问该方法,您也可以访问参数注释,不是吗?@Naman这不是直接在方法参数上的注释,而是在方法参数的类型参数上的注释,正如我所写的,您不能通过调用
方法.getParameterAnnotations来获得此注释>。OP混淆了形式术语“类型参数”和“类型参数”,但混淆“参数”和“参数”是很常见的。关于类型参数注释的有效性,您应该遵循以下链接…