问题标签 [annotation-processing]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
java - 我可以从 TypeVariable 或 VariableElement 获取基础类上的方法列表吗?在编译时的注释处理器中
我有一个带注释的类:
在我的注释处理器中,我想获取传递给 setMessage 方法的 Object 的 getter 方法列表,然后此信息将用于代码生成。
我扩展了 ElementScanner6 并设法获得了一个似乎包含参数的 VariableElement,但我不知道从这里去哪里。
所以在这个例子中,我想在编译时获取 TestMessage 类中的所有方法。
有任何想法吗
java - 如何在代码生成的注释处理期间检索注释的类类型?
注释处理器将为您提供两个TypeElement,一个用于注释对象,一个用于注释本身。
假设Class
在注释处理期间需要知道被注释对象的类型以生成代码。可以使用TypeElement.getQualifiedName()提取限定名称。但是,任何尝试使用都会Class.forName(fullyQualifiedName)
抛出ClassNotFoundException
.
这可能意味着该类不在注释处理代码的路径上。是否有可能在注释处理期间检索这样的类,而不必将所有带注释的代码放在处理库的类路径中?
一种解决方法是生成如下内容:
并在生成的代码中使用 c ,但它并不干净。
eclipse - 在 Eclipse Indigo 上对我的静态元模型类进行子打包
我目前正在使用 Eclipse Indigo,我希望在子包中自动生成我的元模型类,而不是将它们放在我的实体的同一个包中。
我已按照Eclipse Galileo 上的规范模型生成器的 JPA 用户指南中的说明进行操作,但它根本不适用于 Indigo。:(
有人在子包中使用静态元模型类吗?有没有办法在 Eclipse Indigo 上配置它?
java - Java 6 注解处理——从注解中获取类
我有一个名为 @Pojo 的自定义注释,用于自动生成 wiki 文档:
我这样使用它:
注释资源方法,以便注释处理器可以自动生成描述其期望的资源和类型的 wiki 页面。
我需要value
在注释处理器中读取字段的值,但出现运行时错误。
在我的处理器的源代码中,我有以下几行:
但处理器无法使用实际的类。我想我需要一个javax.lang.model.type.TypeMirror
代替真实班级的代理人。我不知道如何得到一个。
我得到的错误是:
这是我的一个注释Appointment
中提到的一个类。@Pojo
不幸的是,关于 Java 注释处理的文档和/或教程似乎很少。尝试谷歌搜索。
gwt - Requestfactory Validation on Multi-Project 设置
我尝试更改为 gwt2.4 的发布版本并遇到问题。我在我的设置中使用了多个项目。我有一个带有服务器端代码的项目,一个带有共享代码的项目,可以在不同的 gwt 项目中使用,还有一个 gwt 项目将所有内容绑定在一起。我用 Maven 构建一切。我按照此处的注释处理说明进行操作: http ://code.google.com/p/google-web-toolkit/wiki/RequestFactoryInterfaceValidation
当我编译代理和服务所在的共享项目时,会创建带有 DeobfuscatorBuilder.java 的文件夹“generated-sources\apt\”。我将这个项目的源代码作为我的主项目的依赖项,并尝试运行验证器,但此处未创建 DeobfuscatorBuilder.java。一切都可以编译,但是当我调用 requestfactory 时,我得到了错误:
我想我的设置有错误,但我找不到..有人知道如何解决这个问题吗?
问候阿恩
更新:
我将此添加到我的 pom 中:
这会解压缩我的依赖项的源并将它们放入我的目标文件夹中。然后我补充说:
到我的处理器插件。
这样就不必将所有项目都放在工作区中,它应该与持续集成系统一起工作。不过,如果没有安迪斯的回复,就不会想到这一点:)
java - 检查注释处理器中是否存在超类
在注解处理器中获取 a时,您可以使用 methodTypeElement
请求它的超类(或更具体地说,它的超类) 。根据 JavaDoc,不明确扩展任何东西的类型(换句话说,是超类)或接口将返回 a with as 。TypeMirror
getSuperClass()
Object
NoType
NONE
TypeKind
忽略整个模型/镜像 API 似乎在每一个机会都让你感到困惑的事实,我将如何可靠地检查这一点?以下是一些代码摘录:
这是正确的方式吗?看起来比较笨重。由于equals
TypeMirror 的方法不应该用于语义相等检查,我想知道将它用于TypeKind
. 我的直觉说是的,因为它是一个枚举,但是我对此表示怀疑instanceof
。
有没有更好的方法来做到这一点?整个 javax.lang.model 包及其子包在整个商店都有交叉引用,我从来没有真正清楚什么是最好的方法。有些东西有有用的实用方法,然后有些看似简单的任务需要像上面这样可疑的杂技。
java - TypeMirror 的 isSubtype 和 isAssignable 之间的区别
在实用程序接口Types的文档中,其中一个实例必须由编译器提供给 Java SE 6 或 7 的注释处理器,有两种方法让我对我正在处理的代码片段感兴趣。我需要检查一个字段的类型是否是从特定抽象类继承的类型。似乎适用的两种方法是isAssignable
和isSubtype
。但我不确定要使用其中的哪一个。
我已经检查了上述文档中引用的 Java 语言规范的那些部分。我理解子类型和赋值转换概念之间的区别(至少我认为我知道)。除非我弄错了,否则java.lang.Short
不会是基元的long
子类型(子类型是在基元之间定义的,但不是跨类和基元定义的),但是由于拆箱和扩大转换,它可以像这样分配:
但是,我仍然不确定在我的情况下使用的最佳方法是什么。检查子类型似乎比可分配性更严格和更可取,但是当涉及到类时,感觉好像一个自动暗示另一个。
长版短:当比较的 TypeMirror 都用于类(不是接口或枚举)时,它们是等效的吗isAssignable
?isSubtype
java - 处理方法体内的注释
我正在使用 Pluggable Annotation Processing API 处理 java 注释。是否也可以处理方法体内使用的注释?
感谢帮助。彼得
java - 跨编译轮次处理环境成员的一致性
JDK 6 和 7 中的 Java 注释处理 API(不是 5 中的 apt 工具 API)定义了注释处理器的生命周期。一个是通过无参数构造函数实例化的,init
使用实例调用该方法ProcessingEnvironment
,然后通过该process
方法使用该处理器。如果适用,在所有后续处理轮次中只制作和使用一个处理器实例。
由于我的处理器类变得有点臃肿,我已经为它应该处理的单独注释创建了处理程序类。在这些类的方法中,我总是传入我从它们的实用方法中获得Elements
的实例。这使我的方法签名相当长。Types
ProcessingEnvironment
我宁愿只在处理程序以及处理器实例中保留对Elements
and实例的引用。Types
我通过将它们从ProcessingEnvironment
传递到init
方法中来做到这一点。现在,我想知道这是否安全。JavaDoc forProcessor
清楚地表明,某些方法仅对处理器调用一次,但init
此处未提及。我有点假设这是隐含的理解,但我不是 100% 确定。
我还想知道Messager
也可以从中获得的实例ProcessingEnvironment
在所有处理轮次中是否保持不变。我宁愿没有出现一轮的警告/错误,但其他人却被排除在外。我有理由确定在各轮中使用相同的实例应该是安全的,但只是想要一些确定性。
java - 向前兼容 Java 6 注释处理器和 SupportedSourceVersion
我正在为一个项目尝试 Java 7,并从此类注释处理器(Bindgen 和 Hibernate JPA modelgen)中收到警告:
这是由@SupportedSourceVersion(SourceVersion.RELEASE_6)
注释处理器类上的注释引起的。由于它们是使用 Java 6 编译的,因此SourceVersion
它们可用的最高值是RELEASE_6
. Java 7 版本SourceVersion
引入了RELEASE_7
.
我的问题:注释处理器应该如何处理前向兼容性?是否必须有单独的 jdk6 和 jdk7 二进制版本?我不明白这里的其他东西吗?
我只找到了有关此问题的以下信息:
评论者建议支持最新源版本的Oracle 博客