问题标签 [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 - 在 Java 6 注解处理器中查找方法返回类型的类型参数
我正在编写一个工具,它使用注释处理器根据带注释的类的方法的返回类型生成源代码。返回类型始终A
是定义类型变量的接口的某个子类型(接口或类) T
。
我想找到方法m()
返回值类型变量的类型参数T
。
返回类型由注释处理器表示为一个javax.lang.model.type.TypeMirror
实例。最简单的情况是A<T>
直接返回。
要找出的处理器代码T
非常简单。(我将在这里转换而不是使用访问者 API 以保持代码简单。)
TypeMirror
返回类型的 是 a并且javax.lang.model.type.DeclaredType
是T
第一个类型参数。结果t
是一个javax.lang.model.type.TypeVariable
for T
。这同样适用于具体的返回类型A<B>
(B
是某种类型:)interface B{}
。的结果t
是一个DeclaredType
表示B
。
其他结果类型开始变得复杂:
有没有办法在T
不镜像整个 java 类型系统的情况下找到正确的类型参数?
java - 在 Maven 中为注释处理器设置生成的源目录
我正在尝试将使用注释处理器生成源的构建移动到 Maven。我尝试如下配置 maven-compiler-plugin:
但是 javac 失败了
据我所知,-s 应该在源文件之前传递给 javac,但是 maven 之后传递它。
如何将-s
标志正确传递给 maven-compiler-plugin?
更新:maven-annotation-plugin似乎不起作用。
当配置为
执行失败
java - 如何为 java 注释处理器编写自动化单元测试?
我正在尝试使用 java 注释处理器。我可以使用“JavaCompiler”编写集成测试(事实上我现在正在使用“hickory”)。我可以运行编译过程并分析输出。问题:即使我的注释处理器中没有任何代码,单个测试也会运行大约半秒。这对于在 TDD 样式中使用它来说太长了。
嘲笑依赖对我来说似乎很困难(我不得不嘲笑整个“javax.lang.model.element”包)。有人成功为注释处理器(Java 6)编写单元测试吗?如果不是......你的方法是什么?
java - 如何从 javac 插件获取 MemberSelectTree 中表达式的类型?
我正在尝试以 JSR 269 格式编写注释处理器,它使用 javac 的编译器树 API 来进行一些源代码分析。我对成员选择表达式感兴趣,例如方法调用。
我可以很容易地获得被选择的方法(或字段等)的名称。但我想知道该成员是从什么类型中选择的,而且我似乎找不到一种直接的方法来做到这一点。Trees.getTypeMirror
返回null
我尝试调用它的所有内容(Javadoc 没有给出任何提示)。
我想我可以详尽地分析成员 select 左侧的每种表达式,并通过递归分析确定表达式的静态类型:NewClassTree
, TypeCastTree
, MethodInvocationTree
,ArrayAccessTree
等等。但这似乎是很多容易出错的工作,而且显然 javac 已经知道表达式的静态类型,因为它需要这些信息用于许多目的。但是我如何访问这种类型的信息?
到目前为止我所拥有的:
以及在一些简单的代码制作方法调用上运行时打印的内容:
java - 如何使用 Java 1.6 Annotation Processing 执行编译时编织?
我创建了一个注解,将它应用到一个 DTO 并编写了一个 Java 1.6 风格的注解处理器。我可以看到如何让 annotationProcessor 编写一个新的源文件,这不是我想要做的,我看不到或知道如何让它修改现有的类(理想情况下只是修改字节码)。修改实际上是相当微不足道的,我希望处理器做的就是插入一个新的 getter 和 setter,其中名称来自正在处理的注释的值。
我的注释处理器看起来像这样;
java - 如何生成 JPA 实体元模型?
本着与CriteriaQuery相关的类型安全的精神, JPA 2.0 也有一个 API 来支持实体的元模型表示。
是否有人知道此 API 的完整功能实现(生成元模型而不是手动创建元模型类)?如果有人也知道在 Eclipse 中设置它的步骤,那就太棒了(我认为它就像设置注释处理器一样简单,但你永远不知道)。
编辑:刚刚偶然发现Hibernate JPA 2 Metamodel Generator。但是问题仍然存在,因为我找不到该 jar 的任何下载链接。
编辑 2:自从我问这个问题以来已经过了一段时间,但我想我会回来并在 SourceForge 上添加指向 Hibernate JPA 模型生成器项目的链接
java - 为什么 Eclipse 不编译 APT 生成的类?
在我的 Eclipse 项目中,我正在使用第三方注释处理器,确切地说是Hibernate Metamodel Generator 。注释处理器按预期工作并生成规范指定的 .java 文件。这些文件生成到 Eclipse 项目的目录中的“gen”文件夹下。在项目属性中,这是正确的,因为存在两个源文件夹 - “src”和“gen”。但是,由于某种原因构建项目时,“gen”下的所有 [生成] 源都没有被编译(检查“bin”目录,我只看到“src”目录中的 .class 文件)。有谁知道为什么会这样?
java - 如何从注释处理器中的 AnnotationValue 捕获枚举
我正在尝试使用注释处理器和注释镜像读取注释中的枚举值,但我得到了空值。我认为这与将枚举包装为变量元素的 AnnotationValue 有关。VariableElement#getConstantValue() 的文档说“如果这是初始化为编译时常量的最终字段,则返回此变量的值。” 好的,但 final 不是注释成员的有效修饰符。另外值得注意的是,我可以毫无困难地阅读其他注释值,只是枚举。
我做了一些调查,看起来 AnnotationValue 在运行时被实例化为 Symbol.VarSymbol,但 Symbol.VarSymbol#getConstantValue() 看起来应该只返回对象。
最后,如果我对 AnnotationValue 执行 toString(),我会得到正确的值。
注释:
我的处理器的一部分并嵌套在大量循环中以获取正确的 AnnotaionMirror:
编辑:处理器的更完整版本。
java - Netbeans 中的 JPA 2.0 元模型?
我读到,从 6.9 版开始,Netbeans 包含注释处理支持,这是生成 JPA 2.0 实体元模型所需的功能。
但是,我找不到任何示例或文档来准确说明如何执行此操作。你们中有人在这方面取得成功吗?
java - Eclipse 3.5+ - 注释处理器:无法导入生成的类
我正在使用第 3 方注释处理器从项目中的注释类生成元数据代码(.java 文件)。我已经通过 Eclipse(属性 -> Java 编译器 -> 注释处理)成功配置了处理器,并且代码生成工作正常(代码是自动创建和生成的)。此外,Eclipse 成功地自动完成了生成的类及其字段,没有任何错误。假设我有一个类“some.package.Foo”并且生成的元数据类是“some.package.Foo_”。在自动完成的帮助下,我可以在 Eclipse 编辑器中得到以下代码,没有任何错误:
但是,一旦我实际构建项目(或仅保存文件,因为自动构建已启用),我就会收到错误消息,提示“some.package.Foo_”无法解决。似乎 Eclipse 正在同时生成和编译 some.package.Foo_,或者更有可能。
我找到了两个临时解决方案(实际上首先阻碍了注释处理器的使用):
- 在生成的类的每个构建之前,右键单击每个生成的文件转到属性并取消选中“派生”勾选。之后,我对项目进行了清理,并且导入很好 - 没有更多的错误。但是,如果我再进行一次清理,错误会再次出现,因为文件的生成会导致再次检查“派生”刻度(自动)。所以这真的很烦人而且很耗时。
- 我还取消了所有这些文件中的“派生”标记,这次我取消了源文件夹和包含这些文件的包中的“派生”标记。然后我禁用注释处理器,然后进行清理。没有更多的导入错误,即使我进行了另一次清理,但使用注释处理器没有任何好处,因为如果我要更改会更新模型的东西,我需要重新打开注释处理器,然后重复在生成这些文件的新版本后,这个繁琐的过程将其关闭。
这是 Eclipse 中的错误吗?如果是,是否有比我上面提到的两个更好的解决方法或快速修复?如果没有,我应该怎么解决这个问题?
我还尝试重新排列构建路径上库的顺序,但没有帮助。