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);
}
}