0

我正在尝试通过阅读带注释的方法来生成代码,例如

@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 的参数注释。

有没有办法阅读参数的注释?

4

1 回答 1

1

(这似乎根本与 JavaPoet 无关,它用于将详细信息写入新的 java 文件,而不是读取类型的详细信息。)

Element.toString() 方法实际上只对调试有意义 - APT api(例如 Eclipse 的 JDT)的不同实现返回不同的值。打印方法的完整描述不是一种有效的方法,它还需要包括返回类型,无论是 final/abstract/native/public/private/等。

相反,您可以从 Element(它是一个 ExecutableElement)实例中阅读有关该方法的详细信息。如果您尝试使用 JavaPoet 创建方法,则应使用 MethodSpec 构建器,并将 Element 中的每个细节传递到构建器以创建方法规范。

如上所述,由于这是一个方法,它是一个ExecutableElement,它具有读取参数(和类型参数)的特定方法,以及检查该方法是否为可变参数等。

然后每个参数将是一个VariableElement,它也从 扩展Element,因此您可以阅读其上的注释。

于 2020-12-16T18:27:54.230 回答