2

我正在尝试通过 Java 8 中的编译时注释处理为我的源代码生成一个配置文件。

据我了解,对于getSupportedAnnotationTypes类中列出的每个注释,处理器都会被调用一次。

    @Override
    public Set<String> getSupportedAnnotationTypes() {
        Set<String> set = new LinkedHashSet<>();
        set.add(MCPlugin.class.getCanonicalName());
        set.add(MCAPIVersion.class.getCanonicalName());
        set.add(MCAuthor.class.getCanonicalName());
        set.add(MCAPIVersion.class.getCanonicalName());
        set.add(MCDepend.class.getCanonicalName());
        set.add(MCLoad.class.getCanonicalName());
        set.add(MCLoadBefore.class.getCanonicalName());
        set.add(MCSoftDepend.class.getCanonicalName());
        set.add(MCCommand.class.getCanonicalName());

        return set;
    }

实际上,我不想用一个注释处理器处理所有这些注释(这是正确的方法吗?),因为它会导致MCCommand注释出现问题。所以我的计划是创建另一个注释处理器,它只处理MCCommand注释。

我的问题是,两个处理器的输出应该进入同一个输出文件。(这甚至可能吗?)

我已经尝试过像这样重新打开资源文件(这也是我首先打开它的方式):

FileObject file = filer.createResource(StandardLocation.SOURCE_OUTPUT, "", "config.yml");

这只会产生错误或覆盖现有文件。

TlDr:如何让我的注释处理器编辑另一个注释处理器生成的文件?

4

1 回答 1

2

好的,经过数小时浏览源代码后,FilerFileObject找到了解决方案/解决方法。

为了能够访问JavacFiler您需要将 com.sun.tools 作为依赖项。

向下Filer转换为 aJavacFiler以访问更多方法。文件管理器有一个createResource(...)和一个getResource(...)方法,它似乎做同样的事情,但不同的是createResource(...)打开一个FileObject只写和getResource(...)只读。

因此,为了能够从另一个注释处理器编辑文件,您必须执行以下操作:

  1. 以只读方式打开文件
  2. 读取文件内容
  3. 关闭文件
  4. 以只写方式重新打开文件
  5. 将旧内容写入其中
  6. 添加更多数据
FileObject jfo = filer.getResource(StandardLocation.SOURCE_OUTPUT, "", "test.txt");
String msg = TUtils.JFOToString(jfo);    // Reads FileObject as String
jfo.delete();

jfo = filer.createResource(StandardLocation.SOURCE_OUTPUT, "", "test.txt");
TUtils.writeJFO(jfo, msg + "Hallo ich bin Processor 2");    // Writes String to FileObject
filer.close();

这感觉就像一个黑客,但我似乎工作。

于 2019-12-06T16:00:11.880 回答