问题标签 [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 回答
4459 浏览

eclipse - 如何在保存时在 Eclipse 中运行注释处理器

目前我在eclipse中为一个项目生成带有注释处理器的文件

这是相当耗时的。如何设置 Eclipse 以使其在保存时运行注释处理器?

我有“自动构建”功能集,但它似乎忽略了注释处理器。顺便说一句,我正在使用带有“自动配置 JDT APT 激活”的 m2e apt 插件。

0 投票
2 回答
3449 浏览

java - Java 注释处理 - 目的和示例

即使度过了愉快的时光,我也无法理解注释处理的目的。

我理解为什么运行时需要注释,我能想到的最简单的例子是:

  1. 更换标记接口。
  2. 替换一种类型的市场属性(例如瞬态)
  3. 一般来说,可以在运行时完成的任何用处。

但不幸的是,我无法理解在编译时使用注释的任何实际示例/原因(JDK 提供的默认注释除外,例如 @Override 等)。

我不明白使用注释处理器“生成代码”的目的/需要是什么。

编辑:Javadoc/Custom Java doc 是我可以认为是使用注释处理器的一个实用程序。

0 投票
2 回答
479 浏览

java - eclipse java注解处理提交生成的java类,带有subclipse到svn

我正在使用 Java 注释处理来生成几个 Java 源文件。我在项目特定设置( Properties -> Java Compile -> Annotation Processing)上启用了它。生成工作正常,类最终在.apt_generated源文件夹中。

不幸的是,我无法使用Subversive将生成的 Java 源文件提交到 svn 服务器。如果我选择了.apt_generated源文件夹并执行Team -> Add to Version Control ...对话框不会列出任何要提交的文件。到目前为止,我一直.apt_generated在从命令行提交源文件夹。我可以自定义此行为吗?我无法在团队偏好中找到任何关于此的内容。

我知道调整无头构建的选项。由于我的文件不会经常更改,所以我现在只想提交生成的文件。谢谢!

0 投票
1 回答
5964 浏览

java - 优雅地处理 TypeMirror 和 Class

我刚刚在这里进入 javax AnnotationProcessing,并且遇到了一个丑陋的案例。我将用一系列描述我的学习过程的伪代码行来说明它:

问题是,现在我发现如果客户端代码包含一个核心类,如java.lang.Stringjava.lang.Object作为Class参数,这一行:

...导致 a ClassCastException,因为 AnnotationProcessor 环境足以Class在这种情况下实际检索对象。

我已经想出了TypeMirror在没有的情况下如何做我需要做的一切Class——我现在需要在我的代码中处理它们吗?有没有办法TypeMirrorClass对象中获取 a ?因为我找不到

0 投票
2 回答
1270 浏览

java - 自定义注释处理器 - 使用注释检测方法

我正在尝试编写一个注释 Procssor 来检测使用 @PrintMethod 注释注释的方法。例如在下面的测试类中,我想在测试方法中打印代码。有没有办法做到这一点?

从下面说明的 AnnotationProcessor 类中,我只能获取方法名称,但不能获取方法的详细信息。

测试班

注释处理器类

0 投票
3 回答
12026 浏览

java - Annotation Processor - How to get the Class it is processing

I am trying to write a custom Anntoation processor. The annotation processor will process each class file at compile time to check annotations, But how am i able to get the class that it is currently processing? I am only able to get the class name in the following codes.

0 投票
1 回答
674 浏览

java - 注释处理器仅在首次运行后处理修改的类

我正在开发一个注释处理器。

当处理器项目被编译为 .jar 时,处理发生在我使用处理器的第二个项目的所有类上(当我在 Eclipse 上使用 Project->Clean... 时也会发生)。但是当我更改一个类并保存它时,在我的第二个项目中,处理只发生在这个类中。

问题是我的处理器必须获取所有类的根元素,但是,当它只在一个类中运行时,它只能获取该类的根元素。

关于如何获取项目的所有根元素的任何想法?

0 投票
3 回答
3165 浏览

java - 无法在注释处理器中加载资源(不在类路径上)

我有一个注释处理器,它将使用接口的 getter 方法定义的键生成一个枚举。

该接口位于

MyProject/src/main/java/my.package.MyInterfaces.java。

我想验证驻留在其中的属性文件MyProject/src/main/resources/META-INF/resource-bundle/是否包含生成的枚举中定义的键。

我的问题是属性文件不能通过处理器的类加载器或 Filer.getResource(...) 获得。

  • 如何使该项目的源代码或类路径可供处理器使用,以便我可以加载属性文件?

  • 现在我只有处理器所在的 jar 中的资源可用。我确实尝试通过 eclipse Project/Properties/Java compiler/Annotation processing/Processor 选项定义 -classpath 和/或 -sourcepath 但它没有成功。

有没有人遇到过这样的问题,谁能给我一个线索,告诉我如何让处理器可以使用这些资源?

我确实有 maven 结构但不使用 maven,因为应用程序中有旧的依赖项。所以maven现在不是我的选择。

Eclipse 3.6 Helios 似乎StandardLocation.SOURCE_PATHStandardLocation.CLASS_PATH没有在 Filer#getResource() 中实现,因此将生成的源或类文件写入SOURCE_PATHCLASS_PATH似乎是不可能的,还可以访问SOURCE_PATHCLASS_PATH*上的任何文件

谢谢。

0 投票
1 回答
1031 浏览

java - 如何判断 TypeElement 是否间接实现了接口

getInterfaces()方法TypeElement只返回元素直接实现的接口。有没有一种简单的方法来查找给定的是否TypeElement间接实现了给定的接口?

也就是说,我有一个TypeElement并且我想知道它是否从给定接口下降。

0 投票
0 回答
350 浏览

java - 通过注解处理添加注解

我正在尝试使用注释对我的代码进行一些预处理。在加载时,我想制作类的“虚拟”副本及其功能。但是在编译/构建时,我必须使用注释进行一些“预编译”。我需要 java 的 AbstractProcessor 子类的进程函数中的代码。它应将带有特殊参数的注释“@Named”(取决于注释@SpecialClass 中定义的名称和方法/字段名称)添加到每个既没有@Invisible 也没有@Named 手段的方法/字段到每个字段/方法没有任何注释。如果检测到@SpecialClass-Annotation,则调用 AbstractProcessor 的过程函数。

我想编译这个:

对此:

我此时的问题是我不知道如何向类对象(字段/方法)添加注释我也不了解过程函数的 2 个参数的操作。

我已经找到了这个主题:向 Java 类添加编程注释,但没有人真正给出具体示例。这就是为什么我在这里再次询问,希望有人可以描述它的工作方式。

先感谢您。

附加信息:

实际上我不想确切地问这个问题,因为我不希望人们认为我只是想要你的解决方案,但是当我要求一个例子时,我希望有人可以为我解决它。稍后,当代码被加载到 VM 中时,我会检查每个类的注解 @Named。如果我找到了一个,我将在代表命名空间的对象中注册函数或字段。这意味着如果我想通过这个昵称调用一个函数,我只需选择“对象”并查找方法的昵称。我需要在编译时而不是运行时完成带有注释的方法和字段,因为它可能是真正的方法名称被混淆了。所以运行时的方法和字段可能有无意义的名称。这就是为什么我想在代码被混淆之前完成代码 -> 在编译时。