Компилятор 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);
}
}