我希望编译源文件时不存在依赖关系。
示例:文件A.java:

import some.pkg.B;
public class A extends B {...}

我没有B源代码,我希望钩住JavaFileManager或自定义ClassLoader以获得有问题的符号(“some.package”包和B类包),然后使用我拥有的服务来检索源代码字符串。

编译代码:(inputFiles具有A.java)
JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
CustomClassLoader classLoader = new CustomClassLoader();
StandardJavaFileManager standardfileManager = compiler.getStandardFileManager(this, null, null);
JavaFileManager fileManager = new CustomFileManager(standardfileManager, output, classLoader);
CompilationTask task = compiler.getTask(null, fileManager, this, null, null, inputFiles);
boolean result = task.call();

编译时未触发JavaFileManager(getFileForInput ..)和我的类加载器(findClass,loadClass ..)的钩子(Hook),并且出现错误消息:
A.java:#: package some.pkg does not exist
A.java:#: cannot find symbol
symbol: class B

编辑

在使用API​​之后,遍历JavaCompiler(旧版本)源并阅读Compilation Overview,我仍然找不到可以用来向我提供语法树符号的API挂钩。似乎API需要按照kschneid的建议,基于包名称获取所有资源。
我考虑过的一种解决方法是运行JavaCompiler并分析错误消息以查找缺少的符号。这样,我将知道需要哪些符号,获取它们并重新编译。
还有其他解决方法/解决方案吗?

最佳答案

(我认为您并不是真正使用“package”的包名,因为那将是非法的……)

您的自定义JavaFileManager应该被调用其list方法。希望这种表示法有意义,但是将args组合到该方法应如下所示:

[PLATFORM_CLASS_PATH, some, [CLASS], false]
[CLASS_PATH, some, [SOURCE, CLASS], false]
[PLATFORM_CLASS_PATH, some.pkg, [CLASS], false]
[CLASS_PATH, some.pkg, [SOURCE, CLASS], false]

我不确定您的特定环境创建适当的Iterable<JavaFileObject>实例将有多困难,但是我认为这是必需的...

07-26 02:53