标签: javapoet

注释处理-在每一轮与最后一轮之间生成文件

我正在使用批注处理,无法通过代码中的导入直接使用生成的文件。相反,我必须在生成的类之前添加完整的包。我发布了一个SO问题错误:程序包generate.schema不存在

最后,我弄清楚了原因,结果很简单,请参阅同一篇文章的答案。原来错误是因为我在最后一轮处理中生成文件,而不是在两者之间的任何地方生成文件。

所以我的问题是:

  • 与上一轮之间生成文件相比,在上一轮之间生成文件如何改变对代码中生成文件的访问?

  • 是否有特定原因(与Java相关或其他原因)?

java annotation-processing javapoet

6
推荐指数
0
解决办法
220
查看次数

使用JavaPoet注释代码Gen

我正在使用JavaPoet编写代码生成器,需要在类上添加注释

例如 :

@RequestMapping("/api")
public class SomeResource {
   // rest of the code elided
}
Run Code Online (Sandbox Code Playgroud)

我能够做到这一点:

TypeSpec spec = TypeSpec
   .classBuilder("SomeResource")
     .addAnnotation(AnnotationSpec.builder(RequestMapping.class)
     // what should go here?
     .build())
   .build();
Run Code Online (Sandbox Code Playgroud)

AnnotationSpec.Builder中有一个addMember方法,但似乎没有做我想要的.

java code-generation javapoet

5
推荐指数
1
解决办法
1115
查看次数

如何让JavaPoet生成类文字?

我想使用JavaPoet生成一个类型为literal的注释作为值.例如:

@AutoService(MyService.class)
public class GeneratedClass implements MyService {
}
Run Code Online (Sandbox Code Playgroud)

我已经尝试了所有我能想到的选项,但都没有用:

TypeSpec.classBuilder("GeneratedClass")
    .addModifiers(Modifier.PUBLIC)
    .addSuperinterface(MyService.class)
    .addAnnotation(
        AnnotationSpec.builder(AutoService.class).addMember(
            "value", "$L", MyService.class
        ).build()
    )
Run Code Online (Sandbox Code Playgroud)

使用$L生成interface MyService

使用$T生成my.package.MyService,这是接近但错过了.class部分.

使用$N给出错误:expected name but was my.package.MyService

如何将其生MyService.class成为注释值?

java javapoet

5
推荐指数
1
解决办法
261
查看次数

JavaPoet - 类内部类的字段

我试图将一个内部类(例如接口Listener {})添加到TypeSpec.另外,我想在我的TypeSpec中添加一个Listener类型的字段.我怎么能实现这样的目标?

TypeSpec outerClass = ...;
TypeSpec innerClass = ...;
outerClass.addType(innerClass);
outerClass.addField(...); // How can i add a field of type innerClass?
Run Code Online (Sandbox Code Playgroud)

java javapoet

5
推荐指数
1
解决办法
327
查看次数

如何在java中的javapoet中生成内部类

有没有办法在javapoet库中生成内部类.我可以使用构造函数和方法生成类.但我无法弄清楚如何创建内部类

javapoet

4
推荐指数
1
解决办法
1659
查看次数

如何使用JavaPoet生成调用超类构造函数的构造函数

我想生成一个使用 JavaPoet 扩展其他类的类。

例如我有这个类:

@MyAnnotation
public class ClassA {
  public ClassA(String paramA, int paramB) {
     // some code
  }
} 
Run Code Online (Sandbox Code Playgroud)

我想生成这样的新类:

public class Generated_ClassA extends ClassA {
  public Generated_ClassA (String paramA, int paramB) {
     super(paramA, paramB);
  }
} 
Run Code Online (Sandbox Code Playgroud)

但是,我在 JavaPoet 中没有看到任何现成的 API 来创建调用超类构造函数的构造函数。如何做到这一点以及最佳实践是什么?

java annotation-processing javapoet annotation-processor

4
推荐指数
1
解决办法
1986
查看次数

JavaPoet - 如何向字段添加注释?

谁能告诉我如何使用 JavaPoet 向字段添加注释?

到目前为止,我设法探索的所有示例都是关于向类和方法添加注释。

看起来我在这里遗漏了一些非常简单的东西。

javapoet

4
推荐指数
1
解决办法
411
查看次数

如何使用JavaPoet生成没有名称的注释?

假设我想用类似的注释类@RunWith(AndroidJUnit4.class)。一般的JavaPoet配方为:

  private static ClassName RUN_WITH=ClassName.get("org.junit.runner", "RunWith");
  private static ClassName ANDROID_JUNIT4=ClassName.get("android.support.test.runner", "AndroidJUnit4");

  private TypeSpec buildTestClass() {
    return TypeSpec.classBuilder("MainActivityTest")
      .addModifiers(Modifier.PUBLIC)
      .addAnnotation(AnnotationSpec.builder(RUN_WITH)
        .addMember(null, "$T.class", ANDROID_JUNIT4)
        .build())
      .build();
  }
Run Code Online (Sandbox Code Playgroud)

但是,每个addMember()方法上的两个方法AnnotationSpec.Builder都有一个成员名称...,我不想要一个名称。我尝试了null,如上所示,并且生成了:

@RunWith(
    null = AndroidJUnit4.class
)
Run Code Online (Sandbox Code Playgroud)

那么...我们如何生成一个“匿名”(或对于单个未命名成员的专有名词)注释?

java javapoet

4
推荐指数
1
解决办法
241
查看次数

使用JavaPoet生成自引用泛型类型

我怎样才能生成以下内容:

class A extends B<A> {}
Run Code Online (Sandbox Code Playgroud)

我坚持构造ParameterizedTypeName来添加超类,我似乎无法在构造之前找到引用A类型的方法...

有什么指针吗?这是可能吗?

java generics self-reference javapoet

3
推荐指数
1
解决办法
749
查看次数

javapoet 如何创建静态导入

如何使用 JavaPoet 创建静态导入?

我尝试生成的代码如下所示:

import static com.test.Types.*;
Run Code Online (Sandbox Code Playgroud)

java javapoet

3
推荐指数
1
解决办法
2286
查看次数