我正在使用批注处理,无法通过代码中的导入直接使用生成的文件。相反,我必须在生成的类之前添加完整的包。我发布了一个SO问题错误:程序包generate.schema不存在。
最后,我弄清楚了原因,结果很简单,请参阅同一篇文章的答案。原来错误是因为我在最后一轮处理中生成文件,而不是在两者之间的任何地方生成文件。
所以我的问题是:
与上一轮之间生成文件相比,在上一轮之间生成文件如何改变对代码中生成文件的访问?
是否有特定原因(与Java相关或其他原因)?
我正在使用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方法,但似乎没有做我想要的.
我想使用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成为注释值?
我试图将一个内部类(例如接口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) 有没有办法在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 来创建调用超类构造函数的构造函数。如何做到这一点以及最佳实践是什么?
谁能告诉我如何使用 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)
那么...我们如何生成一个“匿名”(或对于单个未命名成员的专有名词)注释?
我怎样才能生成以下内容:
class A extends B<A> {}
Run Code Online (Sandbox Code Playgroud)
我坚持构造ParameterizedTypeName来添加超类,我似乎无法在构造之前找到引用A类型的方法...
有什么指针吗?这是可能吗?
如何使用 JavaPoet 创建静态导入?
我尝试生成的代码如下所示:
import static com.test.Types.*;
Run Code Online (Sandbox Code Playgroud)