标签: annotation-processing

eclipse java注释处理

我想在eclipse jdt中使用Annotation处理做一些事情.

Eclipse jdtapt帮助告诉我应该在java/compiler/annotation处理首选项页面上配置东西.

但是在我的安装(Indigo)上,编译器部分没有这个注释处理子部分.它只有构建,错误/警告,javadoc,任务标记.

我的安装有问题吗?

java eclipse apt annotation-processing eclipse-indigo

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

如何通过AnnotationProcessor访问TypeUse注释

题:

  1. 是否可以@Target(ElementType.TYPE_USE)通过注释处理器访问带有注释的元素?
  2. 是否可以通过注释处理器访问带注释的类型边界?

高度赞赏我错过的相关文档的链接。

内容:

注释:

@Target(ElementType.TYPE_USE)
@Retention(RetentionPolicy.SOURCE)
public @interface TypeUseAnno {}
Run Code Online (Sandbox Code Playgroud)

一个示例类:

public class SomeClass extends HashMap<@TypeUseAnno String, String> {}
Run Code Online (Sandbox Code Playgroud)

处理器:

@SupportedSourceVersion(SourceVersion.RELEASE_8)
@SupportedAnnotationTypes("base.annotations.TypeUseAnno")
public class Processor extends AbstractProcessor {

    @Override
    public synchronized void init(ProcessingEnvironment processingEnv) {
        super.init(processingEnv);
        this.processingEnv.getMessager().printMessage(Diagnostic.Kind.WARNING, "Initialized.");
    }

    @Override
    public boolean process(Set<? extends TypeElement> annotations, RoundEnvironment roundEnv) {
        this.processingEnv.getMessager().printMessage(Diagnostic.Kind.WARNING, "Invoked.");
        for (TypeElement annotation : annotations) {
            this.processingEnv.getMessager().printMessage(Diagnostic.Kind.WARNING, "" + roundEnv.getElementsAnnotatedWith(annotation));
        }
        return true;
    }
}
Run Code Online (Sandbox Code Playgroud)

在classpath 上SomeClass使用编译以上内容Processor将显示"Intialized"消息,但process(...)永远不会调用该方法。 …

java annotation-processing

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

如何使我自己的注释处理器增量?

我创建了一个名为EasyPrefs的注释处理器,当我尝试在我的项目中使用它时,它显示以下警告。

请求了增量注释处理,但由于以下处理器不是增量的,因此支持被禁用:net.androidcart.easyprefs.EasyPrefsProcessor (NON_INCREMENTAL)。

我做了一些研究,但找不到任何关于如何使其增量的教程。是否需要任何 Gradle 配置,或者需要覆盖某些功能等。

android gradle annotation-processing

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

在Java 6注释处理器中查找方法返回类型的类型参数

我正在编写一个工具,它使用注释处理器根据注释类的方法的返回类型生成源代码.返回类型始终A是定义类型变量的接口的某个子类型(接口或类)T.

interface A<T>{T m();};
Run Code Online (Sandbox Code Playgroud)

我想找到方法m()返回值类型变量的类型参数T.

返回类型由注释处理器表示为javax.lang.model.type.TypeMirror实例.最简单的情况是A<T>直接返回.

@SomeAnnotation
class SomeClass{
    A<T> x();
}
Run Code Online (Sandbox Code Playgroud)

要找到的处理器代码T非常简单.(我会在这里投射而不是使用访问者API来保持代码简单.)

DeclaredType type = (DeclaredType) typeMirror;
TypeMirror t = type.getTypeArguments().get(0);
Run Code Online (Sandbox Code Playgroud)

TypeMirror返回类型的是javax.lang.model.type.DeclaredTypeT是第一个类型参数.其结果t是一javax.lang.model.type.TypeVariableT.同样适用于具体的返回类型A<B>(B某种类型:) interface B{}.结果tDeclaredType代表B.

其他结果类型开始变得复杂:

interface Subtype<T> extends A<T>{}
interface Concrete extends A<B>{};
interface Multiple<B,T> extends A<T>{}
interface Bounds<T extends B> extends …
Run Code Online (Sandbox Code Playgroud)

java generics annotations annotation-processing

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

处理方法体内的注释

我正在使用Pluggable Annotation Processing API处理java注释.是它在某种程度上可能也用于处理注释里面的方法体?

感谢帮助.彼得

java apt annotations annotation-processing

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

如何在编译期间逐步调试注释处理器?

我有一个注释处理器,用于注释保留策略= SOURCE.

我不知道如何逐步调试它.

  • 我运行mvn install,编译或打包或者ant javac时发出了print语句,logger信息,我在编译日志中看到了他们的sysouts.

  • 但是,我不知道如何在Eclipse中逐步调试处理器.我的意思是,你如何逐步调试编译时?

java ant debugging maven annotation-processing

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

访问注释处理器中的常量字段

假设一个类定义了一个常量字段:

public class Foo {
  public static final int CONSTANT_FIELD = 3;
}
Run Code Online (Sandbox Code Playgroud)

并假设注释接口声明如下:

public @interface Something {
  int value();
}
Run Code Online (Sandbox Code Playgroud)

最后,假设注释使用如下:

@Something(Foo.CONSTANT_FIELD)
Run Code Online (Sandbox Code Playgroud)

问题:在注释处理器中,如何CONSTANT_FIELD从设置值中获取元素@Something


编辑:在问题本身中包含一个具体的例子.

我有一个像这样使用的注释:

@RuleDependency(recognizer = BQLParser.class,
                rule = BQLParser.RULE_statement,
                version = 0)
Run Code Online (Sandbox Code Playgroud)

注释处理器需要知道这RULE_statement是在BQLParser类中定义的常量.如果我可以直接从设置注释的属性访问Elementfor ,它将消除对属性的需要.这个注解用来数千次实际应用中,并且是永远只是的声明类型不变.解决这个问题会简化注释用法:BQLParser.RULE_statementrulerecognizerrecognizerrule

@RuleDependency(rule = BQLParser.RULE_statement, version = 0)
Run Code Online (Sandbox Code Playgroud)

java annotations annotation-processing java-compiler-api

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

Android Studio中缺少编译器选项> = 0.8.2

最近我升级Android Studio到了0.8.2.现在,我的基于android-annotations的项目无法构建.似乎注释处理以某种方式被禁用.似乎项目编译器设置已经改变,打开/关闭注释处理的选项无处可寻......

编译器设置为0.8.2

我不能像以前那样扩展"编译器"选项:

预期的编译器设置

他们在哪里提出这些选择?

java android annotation-processing android-studio

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

如何在Java中使用自定义类型注释

Java 8具有名为Type annotations(JSR 308)的功能.我想将它用于简单的Object to Object映射器框架.我想像这样定义注释@ExpectedType

@Target({ElementType.TYPE_PARAMETER, ElementType.TYPE_USE})
@Retention(RetentionPolicy.RUNTIME)
public @interface ExpectedType {
    public Class<?> value();
}
Run Code Online (Sandbox Code Playgroud)

然后在我的代码中使用它,如下所示:

public class SomeServiceImpl() {
    public @ExpectedType(ObjectA_DTO.class) IObjectA doSomething(@ExpectedType(ObjectA_Entity.class) IObjectA obj) {
        return (ObjectA_Entity) obj; // it's correct
    }
}
Run Code Online (Sandbox Code Playgroud)

IObjectA是一个由类ObjectA_DTOObjectA_Entity.实现的接口.我想用这种方式服务:

// it's correct
assert someService.doSomething(new ObjectA_DTO()).getClass() == ObjectA_DTO.class;
Run Code Online (Sandbox Code Playgroud)

我想更改SomeServiceImpl方法的调用以使用Object mapper.它可以通过使用JSR 269或AOP 生成的代码来实现.

问题是我编写了简单的注释处理器,它根本不处理类型注释.简单注释处理器的来源如下所示:

@SupportedAnnotationTypes("*")
@SupportedSourceVersion(SourceVersion.RELEASE_8)
public class SimpleAnnotationsProcessor extends AbstractProcessor {

    public boolean process(Set<? extends TypeElement> annotations, RoundEnvironment roundEnv) {
        Messager messager = …
Run Code Online (Sandbox Code Playgroud)

java annotation-processing java-8 type-annotation

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

为maven-processor-plugin编写注释处理器

我有兴趣为maven-processor-plugin编写注释处理器.我对Maven比较新.

在项目路径中应该处理器Java源代码的位置(例如:src/main/java/...)以便它被适当地编译,但不会最终作为我的工件JAR文件的一部分?

java maven-2 maven-3 maven annotation-processing

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