如何生成具有以下签名的方法?
public <T extends MyClass> void doSomething(T t)
Run Code Online (Sandbox Code Playgroud)
到目前为止,我有:
MethodSpec.methodBuilder("doSomething")
.addModifiers(Modifier.PUBLIC)
.addTypeVariable(TypeVariableName.get("T", MyClass.class))
.build()
Run Code Online (Sandbox Code Playgroud)
编辑这是上面的代码生成的内容(我不知道如何添加参数):
public <T extends Myclass> void doSomething()
Run Code Online (Sandbox Code Playgroud) 我为我的Android项目构建了一个注释处理器,使用JavaPoet构建源文件.但是,每次我需要调用addModifiers任何JavaPoet对象时,Android Studio都会将其标记为错误.它会说
Cannot resolve method addModifiers(javax.lang.model.element.Modifier)
Run Code Online (Sandbox Code Playgroud)
要么
addModifiers(javax.lang.model.element.Modifier) cannot be applied to javax.lang.model.element.Modifier
Run Code Online (Sandbox Code Playgroud)
取决于我正在调用方法的对象.我已经多次检查过两个完全合格的类名完全匹配.JavaPoet中的这些方法使用VarArgs参数,但这不应该有所不同,因为我正在编译Java 7.
现在这里是踢球者:包编译得很好,并创建我的源文件.它只会在IDE中给出错误,而不是在javac运行时.修饰符在生成的文件中是正确的.
所以我想我想要回答的是:我如何摆脱IDE错误,我该向谁报告?这是JavaPoet问题,Android Studio问题还是IntelliJ问题,还是我还没有考虑过的问题?
我正在使用JavaPoet生成代码.
在生成的代码中的某处,我想添加一个具有以下参数的方法.
...
public B someMethod(final AbstractObjectBuilder<Persoon,?> builder) {
...
}
...
Run Code Online (Sandbox Code Playgroud)
所以我的JavaPoet代码看起来应该是这样的
//This does not compile, since I don't know what to put as last argument (questionmark)
ParameterizedTypeName parameterizedTypeName = ParameterizedTypeName.get(AbstractObjectBuilder.class, propertyType,?);
ParameterSpec parameterSpec = ParameterSpec.builder(parameterizedTypeName, name+"Builder", Modifier.FINAL).build();
MethodSpec modMethod = MethodSpec.methodBuilder(name)
.addModifiers(Modifier.PUBLIC)
.addParameter(parameterSpec)
.returns(TypeVariableName.get("B"));
...
Run Code Online (Sandbox Code Playgroud) 使用Javapoet,如何实现以下内容:
A类扩展了B类
C类实现接口D.
在javadoc中,提到了如何创建接口.
任何人都知道如何使用javapoet执行以下操作
public class MyClassGenerated extends MyMapper<OtherClass>{
}
Run Code Online (Sandbox Code Playgroud)
我的代码:
TypeSpec generateClass() {
return classBuilder("MyClassGenerated")
.addModifiers(PUBLIC)
.superclass(???????????????)
.build();
}
Run Code Online (Sandbox Code Playgroud) 我一直在试注注释处理器中的代码生成.
考虑以下代码,添加一个在其中包含语句的构造函数.
private void addRegister(ExecutableElement el) {
MethodSpec builder = MethodSpec.constructorBuilder().addStatement("$T.register(this)", EventExecutor.class).build();
TypeSpec spec = TypeSpec.classBuilder(el.getEnclosingElement().getSimpleName().toString()).addOriginatingElement(el).addMethod(builder).build();
JavaFile file = JavaFile.builder(pEnv.getElementUtils().getPackageOf(el.getEnclosingElement()).getQualifiedName().toString(), spec).build();
pEnv.getMessager().printMessage(Diagnostic.Kind.NOTE, file.toString());
}
Run Code Online (Sandbox Code Playgroud)
现在,当在"Test"类中给出一个名为"bla"的可执行元素时,结果如下:
class Test {
Test() {
EventExecutor.register(this);
}
}
Run Code Online (Sandbox Code Playgroud)
但是这个类已经存在,我想将构造函数追加到现有代码中,而不是在这里创建这个新类.
现有代码:
public class Test {
@Event
public void bla(TestEvent event) {
}
}
Run Code Online (Sandbox Code Playgroud)
我可以这样做吗?
我正在使用JavaPoet编写代码生成器,需要在类上添加注释
例如 :
package some.package
import org.hibernate.annotations.CacheConcurrencyStrategy;
import javax.persistence.Entity;
import javax.persistence.Cache
@Entity
@Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE)
public class SomeClass {
}
Run Code Online (Sandbox Code Playgroud)
我的代码看起来像这样:
TypeSpec spec = TypeSpec
.classBuilder("SomeClass")
.addAnnotation(Entity.class)
.addAnnotation(AnnotationSpec.builder(Cache.class)
.addMember("usage", "$L", CacheConcurrencyStrategy.NONSTRICT_READ_WRITE)
.build())
.build()
Run Code Online (Sandbox Code Playgroud)
此代码生成类,但生成的代码缺少CacheConcurrencyStrategy的import语句.如何生成代码以便输出所有必需的代码?
我想生成这样的字段:
public static Map<String, Class<?>> ID_MAP = new HashMap<String, Class<?>>();
Run Code Online (Sandbox Code Playgroud)
WildcardTypeName.subtypeOf(Object.class)可以给'?' WildcardTypeName.subtypeOf(Class.class)可以赋予'Class'
嘿我正在尝试生成这样的类:
public abstract class ResourceListAdapter<T extends ResourceViewHolder> extends RecyclerView.Adapter<T> {}
Run Code Online (Sandbox Code Playgroud)
目前我可以生成:
public abstract class ResourceListAdapter extends RecyclerView.Adapter<?> {}
Run Code Online (Sandbox Code Playgroud)
使用以下代码:
TypeSpec type = TypeSpec.classBuilder(thisClass).superclass(ParameterizedTypeName.get(adapterClassName,
WildcardTypeName.subtypeOf(Object.class)))
.addModifiers(Modifier.ABSTRACT, Modifier.PUBLIC)
.build();
Run Code Online (Sandbox Code Playgroud)
我也可以这样做:
private ResourceListAdapter<? extends ResourceViewHolder> adapter;
Run Code Online (Sandbox Code Playgroud)
附:
ParameterizedTypeName.get(thisClass,WildcardTypeName.subtypeOf(resourceViewHolderClassName));
Run Code Online (Sandbox Code Playgroud)
但我无法将其结合起来.所以你有什么想法吗?
我正在使用批注处理,无法通过代码中的导入直接使用生成的文件。相反,我必须在生成的类之前添加完整的包。我发布了一个SO问题错误:程序包generate.schema不存在。
最后,我弄清楚了原因,结果很简单,请参阅同一篇文章的答案。原来错误是因为我在最后一轮处理中生成文件,而不是在两者之间的任何地方生成文件。
所以我的问题是:
与上一轮之间生成文件相比,在上一轮之间生成文件如何改变对代码中生成文件的访问?
是否有特定原因(与Java相关或其他原因)?