- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我有两个带有方法的类,我想将两个类的方法合并到一个类中。
@Service("ITestService")
public interface ITest1
{
@Export
void method1();
}
@Service("ITestService")
public interface ITest2
{
@Export
void method2();
}
结果应该是:
public interface ITestService extends Remote
{
void method1();
void method2();
}
我的 AnnotationProcessor 的第一次运行生成了正确的输出(因为 RoundEnvironment 包含这两个类)。
但是如果我编辑其中一个类(例如添加一个新方法),RoundEnviroment 仅包含编辑后的类,因此结果如下(将 newMethod() 添加到接口(interface) ITest1)
public interface ITestService extends Remote
{
void method1();
void newMethod();
}
现在缺少 method2。我不知道如何解决我的问题。有没有办法(环境)访问项目中的所有类?或者有其他方法可以解决这个问题吗?
生成类的代码很长,所以这里简要描述一下我是如何生成类的。我使用 env.getElementsAnnotatedWith(Service.class)
遍历元素并提取方法并将它们写入新文件:
FileObject file = null;
file = filer.createSourceFile("com/test/" + serviceName);
file.openWriter().append(serviceContent).close();
最佳答案
-- 选项 1 - 从命令行手动编译 ---
我尝试做你想做的,即从处理器访问所有类,正如人们评论的那样,javac 总是编译所有类,并且从 RoundEnvironment 中我确实可以访问所有正在编译的类,每次(甚至当没有文件更改时),有一个小细节:只要所有类都显示在要编译的类列表中。
我用两个接口(interface)做了一些测试,其中一个 (A) 依赖于 (B) 另一个(扩展),我有以下场景:
Implicitly compiled files were not subject to annotation processing.
如果您将编译器设置为冗长,您将收到一条明确的消息,显示每轮将处理哪些类。这是我显式传递接口(interface) (A) 时得到的:
Round 1:
input files: {com.bearprogrammer.test.TestInterface}
annotations: [com.bearprogrammer.annotation.Service]
last round: false
这就是我添加这两个类时得到的结果:
Round 1:
input files: {com.bearprogrammer.test.AnotherInterface, com.bearprogrammer.test.TestInterface}
annotations: [com.bearprogrammer.annotation.Service]
last round: false
在这两种情况下,我都看到编译器解析了这两个类,但顺序不同。对于第一种情况(只添加了一个接口(interface)):
[parsing started RegularFileObject[src\main\java\com\bearprogrammer\test\TestInterface.java]]
[parsing completed 15ms]
[search path for source files: src\main\java]
[search path for class files: ...]
[loading ZipFileIndexFileObject[lib\processor.jar(com/bearprogrammer/annotation/Service.class)]]
[loading RegularFileObject[src\main\java\com\bearprogrammer\test\AnotherInterface.java]]
[parsing started RegularFileObject[src\main\java\com\bearprogrammer\test\AnotherInterface.java]]
对于第二种情况(添加所有接口(interface)):
[parsing started RegularFileObject[src\main\java\com\bearprogrammer\test\AnotherInterface.java]]
...
[parsing started RegularFileObject[src\main\java\com\bearprogrammer\test\TestInterface.java]]
[search path for source files: src\main\java]
[search path for class files: ...]
...
这里的重要细节是编译器在第一种情况下将依赖项作为编译的隐式对象加载。在第二种情况下,它将加载它作为待编译对象的一部分(您可以看到这一点,因为它在解析提供的类后开始搜索文件的其他路径)。并且似乎隐式对象不包含在注释处理列表中。
有关编译过程的更多详细信息,请查看此 Compilation Overview .这并没有明确说明拾取哪些文件进行处理。
在这种情况下,解决方案是始终将所有类添加到编译器的命令中。
--- 选项 2 - 从 Eclipse 编译 ---
如果您从 Eclipse 编译,增量构建将使您的处理器失败(尚未测试)。但我认为你可以绕过要求一个干净的构建(项目 > 清洁......,也没有测试过)或编写一个总是清理类目录并设置 Ant Builder from Eclipse 的 Ant 构建。 .
--- 选项 3 - 使用构建工具 ---
如果您使用的是 Ant、Maven 或 Gradle 等其他构建工具,最好的解决方案是将源代码生成与编译分开进行。您还需要在单独的前一步中编译您的处理器(如果在 Maven/Gradle 中使用多项目构建,则需要单独的子项目)。这将是最佳方案,因为:
-proc:only
来仅处理文件)对于第三个选项,您还可以设置一个 Ant 构建脚本来从 Eclipse 中生成这些文件,作为一个在 Java 构建器之前运行的构建器。在一些特殊文件夹中生成源文件,并将其添加到 Eclipse 中的类路径/构建路径。
关于java - AnnotationProcessor 使用多个源文件创建一个文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13397987/
我有一个项目,其中包含两个源文件和一个头文件(其中包含名为 Get.c 的源文件之一中定义的函数的原型(prototype)),问题是: 当我在另一个源文件中包含 Get.c 时,它给出了错误 错误:
有没有尽可能多的语法结构的java源代码文件? java 编译器的某种测试文件。我需要该文件来测试 java 源代码解析器。 最佳答案 看看 Java Compatibility Kit ,特别Tec
尝试在命令提示符下编译时,我在使用 codeblocks-16.01mingw-setup.exe - 安装在路径不包含空格的文件中时遇到问题。初学者指南建议在命令提示符中使用以下行: gcc car
我编写了一个使用 Cryptopp 库的程序。我已经创建了静态库并将其包含在我的分发版中,但是该程序还需要很多头文件。我的问题是我需要在我的发行版中包含所有这些头文件吗? 例如,我编写了一个代码,其中
我在源代码树中有 protobuf 原型(prototype)文件。我想在每次更改和首次运行时从原型(prototype)文件生成源文件(例如,我创建新的原型(prototype)文件)。然后,我想从
我知道在 Java 中加载文件而不指定要使用的编码是平台相关的。但我的问题是关于 .java 源文件本身中包含的文本:用于这些文件的编码是否仍然相关一旦编译? 例如,如果我在 Windows 上有一个
编辑:{ 我想我在这里添加了很多(太多)信息(阅读)。我想要的是: 我正在使用一个网站(没有.csproj文件) 我需要多个源代码文件才能运行我的aspx 据我所知,当请求aspx文件时,我要么需要使
我从 Asio 的示例页面中获取了以下代码 class tcp_connection : public boost::enable_shared_from_this { public: t
我已经使用 VS2010 为我的 C++ 应用程序创建了一个 Windows 安装部署。但是我的问题是我不知道如何将我自己的一些代码压缩到安装向导中(这可能吗?)。问题是在安装过程中我想要: 要求用户
最近我创建了一个 bash 脚本,我应该在 cron 中运行它。 准备好bash脚本并正常运行后,我将其放入Cron中,发现它失败了。作为第二步,我删除了所有环境依赖项,即我指定的不是 file.tx
考虑以下场景 例子.txt: ÄäÖöÜü Java 源代码: try (FileInputStream fileInputStream = new FileInputStream("example.
背景我主要使用嵌入式 C/C++ 进行编程,但有时我必须为我们的 API 进行一些 C# 编程。为此,我使用 Visual Studio 2017 为我们的客户创建 API DLL。 C# API 和
这个问题在这里已经有了答案: ggplot's qplot does not execute on sourcing (1 个回答) 关闭 9 年前。 考虑这种形式的源文件: # initializ
已关闭。此问题不符合Stack Overflow guidelines 。目前不接受答案。 要求我们推荐或查找工具、库或最喜欢的场外资源的问题对于 Stack Overflow 来说是偏离主题的,因为
我需要读取一个 Racket 源文件并通过宏扩展来运行它。我有一个简单的测试文件,Racket 本身很乐意接受: C:\ayane>type factorial.rkt #lang racket (p
我的源文件位于此文件夹中:c:\data\mycompany。我的所有源文件的第一行都包含以下内容:package mycompany;现在,我从 c:\data 文件夹中使用以下命令编译了所有内容:
这个问题在这里已经有了答案: #include all .cpp files into a single compilation unit? (6 个回答) The benefits / disadv
我对这个 JAVA RMI 项目真的很陌生。我只是想知道我可以使用什么编译器来编译我的JAVA源代码?以及如何做到这一点? 我正在尝试编译来自 http://www.eg.bucknell.edu/~
我想使用 Subversion 并仅 check out 源文件(例如:仅 check out .c 、 .cpp 和 .h 文件)。这可能吗 ?如果是这样,我该怎么做? 我正在尝试从以下位置获取 w
有没有办法使用指向唯一头文件的不同配置(或不同方法)来设置单个项目。 我想创建一个包含两个头文件的 C 项目(例如 header1.h 和 header2.h)。在我的 .c 源文件中,我定义了两个配
我是一名优秀的程序员,十分优秀!