Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/396.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用Java注释处理器理解方法参数的参数化类型_Java_Annotations_Annotation Processing - Fatal编程技术网

使用Java注释处理器理解方法参数的参数化类型

使用Java注释处理器理解方法参数的参数化类型,java,annotations,annotation-processing,Java,Annotations,Annotation Processing,我试图使用注释处理器来验证注释,作为这项工作的一部分,我试图找出如何使用API来确定ExecutableElement的参数是否为参数化类型(如List),如果是,参数化类型是什么(Foo) 除了解析ve.asType().toString()给出的字符串(其中variablelement ve是ExecutableElement e.getParameters()的一个元素)之外,还有其他方法可以做到这一点吗?最好能更好地处理这些类型,而不仅仅是一个字符串。这样做的目的是知道何时转换为什么,在

我试图使用注释处理器来验证注释,作为这项工作的一部分,我试图找出如何使用API来确定ExecutableElement的参数是否为参数化类型(如List),如果是,参数化类型是什么(Foo)


除了解析ve.asType().toString()给出的字符串(其中variablelement ve是ExecutableElement e.getParameters()的一个元素)之外,还有其他方法可以做到这一点吗?最好能更好地处理这些类型,而不仅仅是一个字符串。

这样做的目的是知道何时转换为什么,在您的情况下,您需要获得泛型类型参数,因此您需要转换为
DeclaredType

例如,对于下面这样的方法

@SampleAnno
public void something(List<String> paramx){

}
应该打印
信息:java::>[java.lang.String]

只有一点需要注意:在这里,就像在问题中一样,对
toString()
要非常小心,有时这是不正确的(例如Eclipse的JDT)。取而代之的是,考虑一些类似JavaPoet的<代码> Type名称。GET(…)<代码> >或代码> CordNeal.GET(…)< />代码>,它有一个好的、一致的toStruts()。@ColinAlworth是的,你是对的。我这样做只是为了演示我可以从参数的泛型类型获取typeMirror。但通常我会让它做一些有用的事情。。我总是用javapoter。
ExecutableElement method = (ExecutableElement) this.sampleElement;

method.getParameters()
        .forEach(parameter -> ((DeclaredType)parameter.asType()).getTypeArguments()
                .forEach(typeMirror -> {
                 messager.printMessage(Diagnostic.Kind.NOTE, "::::::: > [" + typeMirror.toString() + "]");
                }));