java - Java Annotation 处理器检查是否完全重建
问题描述
我正在用 Java 创建一个注释处理器,我希望能够检查用户是否触发了完全重建。我希望能够区分完全重建和只构建几个文件。
这可能吗?或者有什么解决方法吗?
编辑1:
我将解释我想要实现的目标。我有一个注释处理器和 10 个注释。其中 8 个注释会生成一个名为plugin.yml
. 这些注释中的 3 个(两个进程中都使用一个注释)用于生成一个名为AutoRegister.java
. 当我触发完全重建并且我的所有注释都得到处理时,这就像一个魅力。现在问题出现在我只编译时,假设 15 个类中的 3 个使用我的注释。然后根据这3个文件plugin.yml
的AutoRegister.java
注释生成,因此不完整。
我的解决方法是创建一个缓存文件,其中包含有关所有其他类的信息,这些信息需要插入到这两个文件plugin.yml
和AutoRegister.java
. 这有点工作,但无法从缓存中删除数据,例如当我从类中删除注释时。因此,从缓存中删除数据的唯一方法是删除缓存文件并触发完全重建。
解决方案
我不认为“解决方法”这个词意味着你认为它的意思。如果有办法区分,那将只是“答案”,而不是“解决方法”。如果您详细说明为什么需要这个,也许可以使用不同的解决方案,即不直接检测“完全重建”与“增量构建”,但这足以满足您的需求。那将是一种解决方法,但您必须解释为什么需要它,以便我们尝试帮助您。
这是我能想到的为什么你需要这个的最常见原因:
假设您的 AP 将扫描所有源文件,并从中提取某种列表。例如,所有实现com.derteufelqwe.MyAwesomeInterface
. 然后,它在某个地方写下这个列表。说,META-INF/services/com.derteufelqwe.MyAwesomeInterface
。问题是:在增量构建期间,您只能看到所有源的子集,因此列表不完整,然后您将其写入需要写入的任何位置,现在您的列表已损坏(因为它不完整)。
解决此问题的方法是您可以要求Filer
提供源文件或类文件;即使它不是编译运行的一部分,它仍然在源路径或类路径上,你会得到一个结果。因此,如果您可以读取现有列表,并且您可以提取每个条目的源文件或类文件(在我们创建服务文件的假设情况下,这很简单:条目本身就是一个完全限定的类名,您可以要求 Filer 查找)然后您可以查询该资源是否仍然存在。如果是,请保留它,如果不是,请删除它。现在您可以更新(而不是重新生成和替换)您的列表。
推荐阅读
- go - 鉴于 IANA 条目是已知的,我如何找到特定的日期偏移量(日光与标准)?
- wordpress - 如何动态导航菜单以及如何调用所有类
- javascript - 循环中javascript中的对象操作
- python - 使用 videojs-record 和 videojs 进行直播
- javascript - Angular 显示表格中断页面
- ruby-on-rails - 在文本中存储单词
- java - 使用算术表达式队列按顺序创建二叉树
- c# - DLL未加载,Win10上的方法未解决错误
- javascript - 我在使用 React 测试库的 React 测试中没有收到任何数量的调用
- php - 如何对从 DB PHP Laravel 返回的字符串执行字符串插值