我想在eclipse jdt中使用Annotation处理做一些事情.
Eclipse jdtapt帮助告诉我应该在java/compiler/annotation处理首选项页面上配置东西.
但是在我的安装(Indigo)上,编译器部分没有这个注释处理子部分.它只有构建,错误/警告,javadoc,任务标记.
我的安装有问题吗?
@Target(ElementType.TYPE_USE)通过注释处理器访问带有注释的元素?高度赞赏我错过的相关文档的链接。
注释:
@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(...)永远不会调用该方法。 …
我创建了一个名为EasyPrefs的注释处理器,当我尝试在我的项目中使用它时,它显示以下警告。
请求了增量注释处理,但由于以下处理器不是增量的,因此支持被禁用:net.androidcart.easyprefs.EasyPrefsProcessor (NON_INCREMENTAL)。
我做了一些研究,但找不到任何关于如何使其增量的教程。是否需要任何 Gradle 配置,或者需要覆盖某些功能等。
我正在编写一个工具,它使用注释处理器根据注释类的方法的返回类型生成源代码.返回类型始终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.DeclaredType和T是第一个类型参数.其结果t是一javax.lang.model.type.TypeVariable对T.同样适用于具体的返回类型A<B>(B某种类型:) interface B{}.结果t是DeclaredType代表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) 我正在使用Pluggable Annotation Processing API处理java注释.是它在某种程度上可能也用于处理注释里面的方法体?
感谢帮助.彼得
我有一个注释处理器,用于注释保留策略= SOURCE.
我不知道如何逐步调试它.
我运行mvn install,编译或打包或者ant javac时发出了print语句,logger信息,我在编译日志中看到了他们的sysouts.
但是,我不知道如何在Eclipse中逐步调试处理器.我的意思是,你如何逐步调试编译时?
假设一个类定义了一个常量字段:
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) 最近我升级Android Studio到了0.8.2.现在,我的基于android-annotations的项目无法构建.似乎注释处理以某种方式被禁用.似乎项目编译器设置已经改变,打开/关闭注释处理的选项无处可寻......

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

他们在哪里提出这些选择?
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_DTO和ObjectA_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) 我有兴趣为maven-processor-plugin编写注释处理器.我对Maven比较新.
在项目路径中应该处理器Java源代码的位置(例如:src/main/java/...)以便它被适当地编译,但不会最终作为我的工件JAR文件的一部分?