Eclipse 的 JDT 编译器提供了一个INameEnvironment
定义方法的接口,findType(...)
使您可以进行级联编译。奇怪的是,我想知道是否有任何方法可以使用标准 JDK 编译器工具包来做到这一点?
请注意,该场景是一个模板引擎,它在内存中编译模板文件生成的具有相互依赖关系的类,它无法预测您遇到模板文件的顺序,因此Foo
可能需要先编译,然后再编译它的父级Bar
,因此您需要一种机制来进行级联编译,这意味着在编译过程中Foo
您需要生成另一个源Bar
并首先对其进行编译才能继续Foo
编译:一些代码如下:
private NameEnvironmentAnswer findType(final String name) {
try {
if (!name.contains(TemplateClass.CN_SUFFIX)) {
return findStandType(name);
}
char[] fileName = name.toCharArray();
TemplateClass templateClass = classCache.getByClassName(name);
// TemplateClass exists
if (templateClass != null) {
if (templateClass.javaByteCode != null) {
ClassFileReader classFileReader = new ClassFileReader(templateClass.javaByteCode, fileName, true);
return new NameEnvironmentAnswer(classFileReader, null);
}
// Cascade compilation
ICompilationUnit compilationUnit = new CompilationUnit(name);
return new NameEnvironmentAnswer(compilationUnit, null);
}
// So it's a standard class
return findStandType(name);
} catch (ClassFormatException e) {
// Something very very bad
throw new RuntimeException(e);
}
}