问题标签 [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 投票
3 回答
7103 浏览

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

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

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

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

要找出的处理器代码T非常简单。(我将在这里转换而不是使用访问者 API 以保持代码简单。)

TypeMirror返回类型的 是 a并且javax.lang.model.type.DeclaredTypeT第一个类型参数。结果t是一个javax.lang.model.type.TypeVariablefor T。这同样适用于具体的返回类型A<B>B是某种类型:)interface B{}。的结果t是一个DeclaredType表示B

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

有没有办法在T不镜像整个 java 类型系统的情况下找到正确的类型参数?

0 投票
7 回答
29697 浏览

java - 在 Maven 中为注释处理器设置生成的源目录

我正在尝试将使用注释处理器生成源的构建移动到 Maven。我尝试如下配置 maven-compiler-plugin:

但是 javac 失败了

据我所知,-s 应该在源文件之前传递给 javac,但是 maven 之后传递它。

如何将-s标志正确传递给 maven-compiler-plugin?


更新maven-annotation-plugin似乎不起作用。

当配置为

执行失败

0 投票
7 回答
9172 浏览

java - 如何为 java 注释处理器编写自动化单元测试?

我正在尝试使用 java 注释处理器。我可以使用“JavaCompiler”编写集成测试(事实上我现在正在使用“hickory”)。我可以运行编译过程并分析输出。问题:即使我的注释处理器中没有任何代码,单个测试也会运行大约半秒。这对于在 TDD 样式中使用它来说太长了。

嘲笑依赖对我来说似乎很困难(我不得不嘲笑整个“javax.lang.model.element”包)。有人成功为注释处理器(Java 6)编写单元测试吗?如果不是......你的方法是什么?

0 投票
1 回答
2041 浏览

java - 如何从 javac 插件获取 MemberSelectTree 中表达式的类型?

我正在尝试以 JSR 269 格式编写注释处理器,它使用 javac 的编译器树 API 来进行一些源代码分析。我对成员选择表达式感兴趣,例如方法调用。

我可以很容易地获得被选择的方法(或字段等)的名称。但我想知道该成员是从什么类型中选择的,而且我似乎找不到一种直接的方法来做到这一点。Trees.getTypeMirror返回null我尝试调用它的所有内容(Javadoc 没有给出任何提示)。

我想我可以详尽地分析成员 select 左侧的每种表达式,并通过递归分析确定表达式的静态类型:NewClassTree, TypeCastTree, MethodInvocationTree,ArrayAccessTree等等。但这似乎是很多容易出错的工作,而且显然 javac 已经知道表达式的静态类型,因为它需要这些信息用于许多目的。但是我如何访问这种类型的信息?

到目前为止我所拥有的:

以及在一些简单的代码制作方法调用上运行时打印的内容:

0 投票
4 回答
8728 浏览

java - 如何使用 Java 1.6 Annotation Processing 执行编译时编织?

我创建了一个注解,将它应用到一个 DTO 并编写了一个 Java 1.6 风格的注解处理器。我可以看到如何让 annotationProcessor 编写一个新的源文件,这不是我想要做的,我看不到或知道如何让它修改现有的类(理想情况下只是修改字节码)。修改实际上是相当微不足道的,我希望处理器做的就是插入一个新的 getter 和 setter,其中名称来自正在处理的注释的值。

我的注释处理器看起来像这样;

0 投票
7 回答
125001 浏览

java - 如何生成 JPA 实体元模型?

本着与CriteriaQuery相关的类型安全的精神, JPA 2.0 也有一个 API 来支持实体的元模型表示。

是否有人知道此 API 的完整功能实现(生成元模型而不是手动创建元模型类)?如果有人也知道在 Eclipse 中设置它的步骤,那就太棒了(我认为它就像设置注释处理器一样简单,但你永远不知道)。

编辑:刚刚偶然发现Hibernate JPA 2 Metamodel Generator。但是问题仍然存在,因为我找不到该 jar 的任何下载链接。

编辑 2:自从我问这个问题以来已经过了一段时间,但我想我会回来并在 SourceForge 上添加指向 Hibernate JPA 模型生成器项目的链接

0 投票
2 回答
2900 浏览

java - 为什么 Eclipse 不编译 APT 生成的类?

在我的 Eclipse 项目中,我正在使用第三方注释处理器,确切地说是Hibernate Metamodel Generator 。注释处理器按预期工作并生成规范指定的 .java 文件。这些文件生成到 Eclipse 项目的目录中的“gen”文件夹下。在项目属性中,这是正确的,因为存在两个源文件夹 - “src”和“gen”。但是,由于某种原因构建项目时,“gen”下的所有 [生成] 源都没有被编译(检查“bin”目录,我只看到“src”目录中的 .class 文件)。有谁知道为什么会这样?

0 投票
2 回答
2654 浏览

java - 如何从注释处理器中的 AnnotationValue 捕获枚举

我正在尝试使用注释处理器和注释镜像读取注释中的枚举值,但我得到了空值。我认为这与将枚举包装为变量元素的 AnnotationValue 有关。VariableElement#getConstantValue() 的文档说“如果这是初始化为编译时常量的最终字段,则返回此变量的值。” 好的,但 final 不是注释成员的有效修饰符。另外值得注意的是,我可以毫无困难地阅读其他注释值,只是枚举。

我做了一些调查,看起来 AnnotationValue 在运行时被实例化为 Symbol.VarSymbol,但 Symbol.VarSymbol#getConstantValue() 看起来应该只返回对象。

最后,如果我对 AnnotationValue 执行 toString(),我会得到正确的值。

注释:

我的处理器的一部分并嵌套在大量循环中以获取正确的 AnnotaionMirror:

编辑:处理器的更完整版本。

0 投票
3 回答
6115 浏览

java - Netbeans 中的 JPA 2.0 元模型?

我读到,从 6.9 版开始,Netbeans 包含注释处理支持,这是生成 JPA 2.0 实体元模型所需的功能。

但是,我找不到任何示例或文档来准确说明如何执行此操作。你们中有人在这方面取得成功吗?

0 投票
4 回答
3825 浏览

java - Eclipse 3.5+ - 注释处理器:无法导入生成的类

我正在使用第 3 方注释处理器从项目中的注释类生成元数据代码(.java 文件)。我已经通过 Eclipse(属性 -> Java 编译器 -> 注释处理)成功配置了处理器,并且代码生成工作正常(代码是自动创建和生成的)。此外,Eclipse 成功地自动完成了生成的类及其字段,没有任何错误。假设我有一个类“some.package.Foo”并且生成的元数据类是“some.package.Foo_”。在自动完成的帮助下,我可以在 Eclipse 编辑器中得到以下代码,没有任何错误:

但是,一旦我实际构建项目(或仅保存文件,因为自动构建已启用),我就会收到错误消息,提示“some.package.Foo_”无法解决。似乎 Eclipse 正在同时生成和编译 some.package.Foo_,或者更有可能。

我找到了两个临时解决方案(实际上首先阻碍了注释处理器的使用):

  1. 在生成的类的每个构建之前,右键单击每个生成的文件转到属性并取消选中“派生”勾选。之后,我对项目进行了清理,并且导入很好 - 没有更多的错误。但是,如果我再进行一次清理,错误会再次出现,因为文件的生成会导致再次检查“派生”刻度(自动)。所以这真的很烦人而且很耗时。
  2. 我还取消了所有这些文件中的“派生”标记,这次我取消了源文件夹和包含这些文件的包中的“派生”标记。然后我禁用注释处理器,然后进行清理。没有更多的导入错误,即使我进行了另一次清理,但使用注释处理器没有任何好处,因为如果我要更改会更新模型的东西,我需要重新打开注释处理器,然后重复在生成这些文件的新版本后,这个繁琐的过程将其关闭。

这是 Eclipse 中的错误吗?如果是,是否有比我上面提到的两个更好的解决方法或快速修复?如果没有,我应该怎么解决这个问题?

我还尝试重新排列构建路径上库的顺序,但没有帮助。