如何使用javapoet读取方法参数的注解

fiei3ece  于 2021-07-03  发布在  Java
关注(0)|答案(1)|浏览(338)

我试图通过阅读带注解的方法来生成代码,比如

@MyAnnotation
public static int generatorMethod(@SomeOtherAnnotation Boolean someArg)

我想复制参数列表,因为它们在生成的代码中
如下图所示:

public class MyGeneratedClass{
    public int myGeneratedMethod(@SomeOtherAnnotation Boolean someArg) {
        //method body
    }
}

但是当我尝试从annotationprocessor类中读取带注解的方法时

for (Element annotatedElement : roundEnv.getElementsAnnotatedWith(MyAnnotation.class)) {
      messager.printMessage(
          Diagnostic.Kind.NOTE, String.format("Annotated Element as string: %s",
      annotatedElement.toString()));
    }

它将值打印为

Annotated Element as string: generatorMethod(java.lang.Boolean)

它没有引用参数的注解,我可以用它来创建parameterspec。
有没有办法读懂论点的注解?

eulz3vhy

eulz3vhy1#

(这似乎根本不是关于javapoet的,它是用于将详细信息写入新的java文件,而不是读取该类型的详细信息。)
tostring()方法实际上只在调试时才有意义——aptapi的不同实现(例如eclipse的jdt)返回不同的值。打印方法的完整描述不是一种有效的方法,它还需要包含返回类型,不管它是final/abstract/native/public/private/等等。
相反,您可以从元素(executableelement)示例中读取有关该方法的详细信息。如果您试图用javapoet创建方法,那么应该使用methodspec构建器,并将元素中的每个细节传递给构建器以创建方法规范。
如上所述,由于这是一种方法,因此它是一种 ExecutableElement ,它有读取参数(和类型参数)的特定方法,以及检查方法是否为varargs param等。
每个参数都将是一个 VariableElement ,也从 Element ,这样您就可以阅读上面的注解了。

相关问题