标签: javapoet

JavaPoet添加通用参数

如何生成具有以下签名的方法?

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)

java code-generation javapoet

10
推荐指数
1
解决办法
3149
查看次数

JavaPoet + Android Studio"addModifiers(Modifier)无法应用于Modifier"

我为我的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问题,还是我还没有考虑过的问题?

java android intellij-idea javapoet

10
推荐指数
1
解决办法
616
查看次数

如何在JavaPoet中添加"任何类型"问号?

我正在使用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)

java code-generation javapoet

9
推荐指数
1
解决办法
3466
查看次数

javapoet - 如何实现"扩展"和"实现"

使用Javapoet,如何实现以下内容:

  1. A类扩展了B类

  2. C类实现接口D.

在javadoc中,提到了如何创建接口.

java javapoet

9
推荐指数
2
解决办法
3893
查看次数

Javapoet超类通用

任何人都知道如何使用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)

java generics android javapoet

8
推荐指数
1
解决办法
1610
查看次数

Javapoet/JavaWriter附加到现有类

我一直在试注注释处理器中的代码生成.

考虑以下代码,添加一个在其中包含语句的构造函数.

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)

我可以这样做吗?

java annotation-processing javapoet

7
推荐指数
1
解决办法
2114
查看次数

使用JavaPoet生成注释

我正在使用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语句.如何生成代码以便输出所有必需的代码?

java codegen javapoet

6
推荐指数
1
解决办法
1580
查看次数

如何使用javapoet生成符号Class <?>

我想生成这样的字段:

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'

javapoet

6
推荐指数
2
解决办法
1434
查看次数

JavaPoet的通用类

嘿我正在尝试生成这样的类:

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)

但我无法将其结合起来.所以你有什么想法吗?

java javapoet

6
推荐指数
1
解决办法
934
查看次数

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

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

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

所以我的问题是:

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

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

java annotation-processing javapoet

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