gpt4 book ai didi

java - 使用 javax.tool 进行级联内存编译

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:01:23 25 4
gpt4 key购买 nike

Eclipse 的 JDT 编译器提供了一个接口(interface) 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);
}
}

最佳答案

根据我们的评论对话,我认为答案很明确:不,您不能使用 JDK 编译器做到这一点。它确实在请求包时给你一个钩子(Hook),但不是特定的类依赖。

据我所知,你能得到的最接近的是:

Here's a nice article使用代码,但需要对其进行调整以在内存类中处理。具体来说,您所描述的问题是由 JavaFileManager.list(...) 方法处理的。您必须在此处返回缓存在内存中的 JavaFileObjects。您很可能需要创建一个 ForwardingJavaFileManager 的子类,如文章中所述——尽管进行了修改以处理您正在使用的缓存类。

你可以用它来编译一些东西。如果它返回错误,请使用正则表达式找出缺少的内容。生成/编译丢失的代码后,重试编译原始代码。

注意:它确实在某些时候要求依赖类的 FQN 作为 ForwardingFileManager.list(...) 中的 packageName 参数。那时我还没有尝试返回类(class)。它可能不起作用,因为包会不匹配,但也许会。

关于java - 使用 javax.tool 进行级联内存编译,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8888189/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com