问题标签 [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.

0 投票
1 回答
2039 浏览

java - 我可以从 TypeVariable 或 VariableElement 获取基础类上的方法列表吗?在编译时的注释处理器中

我有一个带注释的类:

在我的注释处理器中,我想获取传递给 setMessage 方法的 Object 的 getter 方法列表,然后此信息将用于代码生成。

我扩展了 ElementScanner6 并设法获得了一个似乎包含参数的 VariableElement,但我不知道从这里去哪里。

所以在这个例子中,我想在编译时获取 TestMessage 类中的所有方法。

有任何想法吗

0 投票
2 回答
1833 浏览

java - 如何在代码生成的注释处理期间检索注释的类类型?

注释处理器将为您提供两个TypeElement,一个用于注释对象,一个用于注释本身。

假设Class在注释处理期间需要知道被注释对象的类型以生成代码。可以使用TypeElement.getQualifiedName()提取限定名称。但是,任何尝试使用都会Class.forName(fullyQualifiedName)抛出ClassNotFoundException.

这可能意味着该类不在注释处理代码的路径上。是否有可能在注释处理期间检索这样的类,而不必将所有带注释的代码放在处理库的类路径中?

一种解决方法是生成如下内容:

并在生成的代码中使用 c ,但它并不干净。

0 投票
1 回答
1371 浏览

eclipse - 在 Eclipse Indigo 上对我的静态元模型类进行子打包

我目前正在使用 Eclipse Indigo,我希望在子包中自动生成我的元模型类,而不是将它们放在我的实体的同一个包中。

我已按照Eclipse Galileo 上的规范模型生成器的 JPA 用户指南中的说明进行操作,但它根本不适用于 Indigo。:(

有人在子包中使用静态元模型类吗?有没有办法在 Eclipse Indigo 上配置它?

0 投票
4 回答
17600 浏览

java - Java 6 注解处理——从注解中获取类

我有一个名为 @Pojo 的自定义注释,用于自动生成 wiki 文档:

我这样使用它:

注释资源方法,以便注释处理器可以自动生成描述其期望的资源和类型的 wiki 页面。

我需要value在注释处理器中读取字段的值,但出现运行时错误。

在我的处理器的源代码中,我有以下几行:

但处理器无法使用实际的类。我想我需要一个javax.lang.model.type.TypeMirror代替真实班级的代理人。我不知道如何得到一个。

我得到的错误是:

这是我的一个注释Appointment中提到的一个类。@Pojo

不幸的是,关于 Java 注释处理的文档和/或教程似乎很少。尝试谷歌搜索。

0 投票
1 回答
766 浏览

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 中:

这会解压缩我的依赖项的源并将它们放入我的目标文件夹中。然后我补充说:

到我的处理器插件。

这样就不必将所有项目都放在工作区中,它应该与持续集成系统一起工作。不过,如果没有安迪斯的回复,就不会想到这一点:)

0 投票
1 回答
1910 浏览

java - 检查注释处理器中是否存在超类

在注解处理器中获取 a时,您可以使用 methodTypeElement请求它的超类(或更具体地说,它的超类) 。根据 JavaDoc,不明确扩展任何东西的类型(换句话说,是超类)或接口将返回 a with as 。TypeMirrorgetSuperClass()ObjectNoTypeNONETypeKind

忽略整个模型/镜像 API 似乎在每一个机会都让你感到困惑的事实,我将如何可靠地检查这一点?以下是一些代码摘录:

这是正确的方式吗?看起来比较笨重。由于equalsTypeMirror 的方法不应该用于语义相等检查,我想知道将它用于TypeKind. 我的直觉说是的,因为它是一个枚举,但是我对此表示怀疑instanceof

有没有更好的方法来做到这一点?整个 javax.lang.model 包及其子包在整个商店都有交叉引用,我从来没有真正清楚什么是最好的方法。有些东西有有用的实用方法,然后有些看似简单的任务需要像上面这样可疑的杂技。

0 投票
1 回答
1064 浏览

java - TypeMirror 的 isSubtype 和 isAssignable 之间的区别

在实用程序接口Types的文档中,其中一个实例必须由编译器提供给 Java SE 6 或 7 的注释处理器,有两种方法让我对我正在处理的代码片段感兴趣。我需要检查一个字段的类型是否是从特定抽象类继承的类型。似乎适用的两种方法是isAssignableisSubtype。但我不确定要使用其中的哪一个。

我已经检查了上述文档中引用的 Java 语言规范的那些部分。我理解子类型和赋值转换概念之间的区别(至少我认为我知道)。除非我弄错了,否则java.lang.Short不会是基元的long子类型(子类型是在基元之间定义的,但不是跨类和基元定义的),但是由于拆箱和扩大转换,它可以像这样分配:

但是,我仍然不确定在我的情况下使用的最佳方法是什么。检查子类型似乎比可分配性更严格和更可取,但是当涉及到类时,感觉好像一个自动暗示另一个。

长版短:当比较的 TypeMirror 都用于类(不是接口或枚举)时,它们是等效的吗isAssignableisSubtype

0 投票
2 回答
2977 浏览

java - 处理方法体内的注释

我正在使用 Pluggable Annotation Processing API 处理 java 注释。是否也可以处理方法体内使用的注释?

感谢帮助。彼得

0 投票
2 回答
413 浏览

java - 跨编译轮次处理环境成员的一致性

JDK 6 和 7 中的 Java 注释处理 API(不是 5 中的 apt 工具 API)定义了注释处理器的生命周期。一个是通过无参数构造函数实例化的,init使用实例调用该方法ProcessingEnvironment,然后通过该process方法使用该处理器。如果适用,在所有后续处理轮次中只制作和使用一个处理器实例。

由于我的处理器类变得有点臃肿,我已经为它应该处理的单独注释创建了处理程序类。在这些类的方法中,我总是传入我从它们的实用方法中获得Elements的实例。这使我的方法签名相当长。TypesProcessingEnvironment

我宁愿只在处理程序以及处理器实例中保留对Elementsand实例的引用。Types我通过将它们从ProcessingEnvironment传递到init方法中来做到这一点。现在,我想知道这是否安全。JavaDoc forProcessor清楚地表明,某些方法仅对处理器调用一次,但init此处未提及。我有点假设这是隐含的理解,但我不是 100% 确定。

我还想知道Messager也可以从中获得的实例ProcessingEnvironment在所有处理轮次中是否保持不变。我宁愿没有出现一轮的警告/错误,但其他人却被排除在外。我有理由确定在各轮中使用相同的实例应该是安全的,但只是想要一些确定性。

0 投票
1 回答
7683 浏览

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 二进制版本?我不明白这里的其他东西吗?

我只找到了有关此问题的以下信息:

使用的 Querdydsl 错误报告

评论者建议支持最新源版本的Oracle 博客