标签: annotation-processing

什么是默认注释处理器发现过程?

Maven Compiler插件文档提到了以下内容:

annotationProcessors:

要运行的注释处理器的名称.仅适用于JDK 1.6+如果未设置,则应用默认注释处理器发现过程.

这里的默认注释处理器发现过程是什么?有没有其他方法来设置注释处理器而不是此配置标签?

我发现注释处理工具入门(apt)文档提到了一个默认的发现过程,但它适用于工厂类而不是处理器,不幸的是它使用了JDK中的tools.jarcom.sun包.这是默认的注释处理器发现过程吗?

java maven-2 annotations annotation-processing maven-compiler-plugin

15
推荐指数
1
解决办法
5689
查看次数

数据绑定注释处理器kapt警告

在我的app模块的build.gradle中,我添加了

dependencies {
kapt('com.android.databinding:compiler:3.1.2')
...
}
Run Code Online (Sandbox Code Playgroud)

但我仍然收到编译器警告

app: 'annotationProcessor' dependencies won't be recognized as kapt annotation processors. Please change the configuration name to 'kapt' for these artifacts: 'com.android.databinding:compiler:3.1.2'.
Run Code Online (Sandbox Code Playgroud)

一切正常,我只是讨厌挂着警告.

任何帮助深表感谢!

android annotation-processing kotlin kapt

15
推荐指数
1
解决办法
6111
查看次数

Java Generics:在运行时访问Generic Type

我想在运行时访问声明字段的泛型类型.我之前的印象是,由于Java类型的擦除,这是不可能的.但是,情况并非如此,因为一些众所周知的框架在运行时通过反射来利用泛型类型.

例如,Guice将根据您提供的泛型类型实现Provider:

public class Injectable{

    @Inject
    private Provider<SomeType> someTypeProvider;

}
Run Code Online (Sandbox Code Playgroud)

如何通过反射API访问字段的"SomeType"泛型属性或任何此类类型/方法/等?

此外,了解如何通过Java 6 Annotation Processor API访问这些泛型类型属性也很有帮助.

谢谢.

编辑:

谢谢大家的指示.我找到了一种方法,使用haylem的链接,特别是Prenkov的文章Java Reflection:Generics.

这是我正在寻找的答案:

/**
 * @author John Ericksen
 */
public class TypeReflectionExample {

    public class SomeType{}

    public class Injectable{
        @Inject  private Provider<SomeType> someTypeProvider;
    }

    public static void main(String[] args){

        try {
            Field providerField = Injectable.class.getDeclaredField("someTypeProvider");

            Type genericFieldType = providerField.getGenericType();

            if(genericFieldType instanceof ParameterizedType){
                ParameterizedType aType = (ParameterizedType) genericFieldType;
                Type[] fieldArgTypes = aType.getActualTypeArguments();
                for(Type fieldArgType : fieldArgTypes){
                    Class fieldArgClass = (Class) fieldArgType; …
Run Code Online (Sandbox Code Playgroud)

java generics guice type-erasure annotation-processing

14
推荐指数
1
解决办法
7913
查看次数

使用Java 6注释处理器获取泛型类型的限定类名

我正在使用JDK 6的Annotation Processing API开发一个小代码生成器,并试图获得类中字段的实际泛型类型.为了更清楚,让我们说我有这样一个类:

@MyAnnotation
public class User {         
    private String id;
    private String username;
    private String password;
    private Set<Role> roles = new HashSet<Role>();
    private UserProfile profile;
}
Run Code Online (Sandbox Code Playgroud)

这是我的注释处理器类:

@SupportedAnnotationTypes({ "xxx.MyAnnotation" })
@SupportedSourceVersion(SourceVersion.RELEASE_6)
public class MongoDocumentAnnotationProcessor extends AbstractProcessor {

    private Types typeUtils = null;
    private Elements elementUtils = null;

    @Override
    public synchronized void init(ProcessingEnvironment processingEnv) {
        super.init(processingEnv);
        typeUtils = processingEnv.getTypeUtils();
        elementUtils = processingEnv.getElementUtils();
    }

    @Override
    public boolean process(Set<? extends TypeElement> annotations, RoundEnvironment roundEnv) {
        debug("Running " + getClass().getSimpleName());
        if (roundEnv.processingOver() …
Run Code Online (Sandbox Code Playgroud)

java generics annotations annotation-processing

14
推荐指数
2
解决办法
5354
查看次数

AnnotationProcessor使用多个源文件来创建一个文件

我有两个类的方法,我想将两个类的方法组合到一个类.

@Service("ITestService")
public interface ITest1
{
   @Export
   void method1();
}

@Service("ITestService")
public interface ITest2
{
   @Export
   void method2();
}
Run Code Online (Sandbox Code Playgroud)

结果应该是:

public interface ITestService extends Remote
{
  void method1();
  void method2();
}
Run Code Online (Sandbox Code Playgroud)

我的AnnotationProcessor的第一次运行生成正确的输出(因为RoundEnvironment包含两个类).

但是如果我编辑其中一个类(例如添加一个新方法),RoundEnviroment只包含已编辑的类,因此结果如下(向接口ITest1添加newMethod())

public interface ITestService extends Remote
{
  void method1();
  void newMethod();
}
Run Code Online (Sandbox Code Playgroud)

现在缺少method2.我不知道如何解决我的问题.有没有办法(Enviroment),访问项目中的所有类?或者还有另一种解决方法吗?

生成类的代码很长,所以这里简要介绍我如何生成类.我遍历Elements env.getElementsAnnotatedWith(Service.class)并提取方法并将它们写入新文件:

FileObject file = null;
file = filer.createSourceFile("com/test/" + serviceName);
file.openWriter().append(serviceContent).close();
Run Code Online (Sandbox Code Playgroud)

java annotation-processing

14
推荐指数
1
解决办法
1990
查看次数

javax.lang.model:如何获取字段的类型?

java.lang.reflect,人们会这样做:

Field someField = ...;
Class<?> fieldType = someField.getType();
Run Code Online (Sandbox Code Playgroud)

但是,我该怎么做用javax.lang.modelVariableElement(这可能会或可能不会代表一个字段)?相应的返回值将是(我猜)TypeElement.

VariableElement someField = ...;
TypeElement fieldType = someField.???;
Run Code Online (Sandbox Code Playgroud)

那么,在javax.lang.model,如何获得TypeElement字段的类型(或),由VariableElement?表示?

顺便说一下,没有一个适合javax.lang.model的Stackoverflow标签;)

java reflection types mirror annotation-processing

13
推荐指数
1
解决办法
3481
查看次数

Gradle + Annotations + Flavors =不会运行注释处理器

我有一个Gradle构建脚本,它使用注释处理器(Android Annotations)来生成代码.建筑物很好,直到我添加了一个新的Pro Flavor.我可以构建Free味道,但是当我构建Pro flavor时,注释处理器不会运行.这会导致代码丢失并且构建失败.

这是我的脚本:

buildscript {
    repositories {
        maven { url 'http://repo1.maven.org/maven2' }
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:0.5.+'
    }
}
apply plugin: 'android'

repositories {
    mavenCentral()
    maven {
        url 'https://oss.sonatype.org/content/repositories/snapshots/'
    }
}


ext.androidAnnotationsVersion = '3.0-SNAPSHOT';

configurations {
    apt
}


dependencies {
    compile files('libs/android-support-v13.jar')
    compile fileTree(dir: 'libs', include: '*.jar')
    apt "org.androidannotations:androidannotations:${androidAnnotationsVersion}"
    compile "org.androidannotations:androidannotations-api:${androidAnnotationsVersion}"
}

android {
    compileSdkVersion 17
    buildToolsVersion "17.0.0"


    defaultConfig {
        minSdkVersion 7
        targetSdkVersion 17

        versionCode 29
        versionName "2.0.3"
        packageName "com.MyCompany.MyApp"

    }

    productFlavors {
        free …
Run Code Online (Sandbox Code Playgroud)

android gradle annotation-processing android-annotations android-studio

13
推荐指数
1
解决办法
4922
查看次数

Java Annotations Processor:检查TypeMirror是否实现特定接口

我正在使用Java注释处理器.我的注释@foo用于标记可在运行时读取到文件或文件的字段变量.但是,我想检查变量类型是否Serializable在编译期间实现,因此如果该字段不可序列化,我可以在编译时给出警告/错误.

(我不需要实际检查对象是否可序列化,如果它实现了Serializable我信任它的接口).

我已经想出了如何做其他的东西,但我无法弄清楚如何检查该元素是否实现Serializable.我可以使用这个TypeElement#getInterfaces方法,但我无法弄清楚如何检查是否有任何TypeMirror返回的方法Serializable.

此外,如果有人碰巧知道任何好的java.lang.model或Java Annotations教程,那也会有所帮助.

编辑:我试过这个......

isSerializable = false  
for(TypeMirror tm : processingEnv.getTypeUtils().directSupertypes(em.asType()))  
{  
if(isSerializable = "java.io.Serializable".equals(tm.toString()))  
{  
break;  
}  
}  
Run Code Online (Sandbox Code Playgroud)

它适用于直接实现的String和Character,Serializable但是对于从Number超类继承Serializable的Integer,它不起作用.

java reflection annotations annotation-processing

13
推荐指数
1
解决办法
2829
查看次数

如何从注释处理器内部检查包是否存在(在编译时)?

我正在为Android构建一个Annotation Processor(为了将来的解释,让我们称之为TestProcessor).

计划是让处理器以两种模式运行:

  • Mode 1:生成代码 A

  • Mode 2:生成代码AB


Mode 2 只有在处理器生成代码的环境中存在附加(可选)包时才应选择.

如果可选包存在,有没有办法找到注释处理器的process方法


编辑1:

关于"(可选)包"的小澄清.通过附加包我的意思是一个java包,它可能但不一定存在于项目中(即使用处理器).可选包可以例如表示外部库的内容.外部库可以但不必包含在项目中.

我举一个小例子:

  • 假设我们有一个(单模块)项目Sample.
  • Sample正在使用我的TestProcessor.
  • 我们Square's Picasso以外部库为例
  • 如果SampleHAS Square's Picasso作为其依赖项之一,则TestProcessor运行Mode 2并生成代码AB.换句话说:如果您可以使用com.square.picasso(in Sample)中的类而没有任何问题,那么处理器应该运行Mode 2.
  • 如果没有Square's PicassoSample's相关性,TestProcessor工作中Mode 1,并生成唯一的代码A.

编辑2:

我想到了这个问题的两个解决方法:

  1. 为两个使用两种类型的注释processor Modes(例如: …

java android annotation-processing

13
推荐指数
1
解决办法
1269
查看次数

Netbeans中的JPA 2.0元模型?

我已经读过,自版本6.9以来,Netbeans包含注释处理支持,例如,需要一个功能来生成JPA 2.0实体的元模型.

但是,我找不到任何能够准确显示如何操作的示例或文档.你们有没有成功的人?

java netbeans criteria-api annotation-processing jpa-2.0

12
推荐指数
1
解决办法
5796
查看次数