gpt4 book ai didi

具有相互依赖的类的 Java Compiler API

转载 作者:行者123 更新时间:2023-11-29 06:17:59 36 4
gpt4 key购买 nike

我正在使用 Java Compiler API 来编译内存中的类。也就是说,类被编译为字节码(磁盘中没有存储 .classes 文件),然后通过重构字节码来加载。

有时,我需要编译一个类,该类依赖于另一个也在内存中编译的类。例如:编译A类,然后编译依赖A类的B类。

为了解决这个问题,我将 A 类和 B 类都作为编译器 API 的 getTask 方法所需的编译单元。

但是,我真的不喜欢这个解决方案,因为它让我重新编译已经编译过的类 A。

有办法解决这个问题吗?

编辑:我通过此链接找到了解决方案:http://www.ibm.com/developerworks/java/library/j-jcomp/index.html

最佳答案

是的,只要您正确实现 ForwardingJavaFileManager,这是完全可能的。两个最重要的方法是 inferBinaryName()list() .如果您正确设置了这两者,编译器将能够解析您之前编译过的类。

inferBinaryName() 必须返回类' simple name (例如,com.test.Test 的推断二进制名称将只是 Test)。这是我的实现(我的 JavaFileObject 子类称为 InAppJavaFileObject):

@Override
public String inferBinaryName(Location location, JavaFileObject javaFileObject) {

if(location == StandardLocation.CLASS_PATH && javaFileObject instanceof InAppJavaFileObject) {
return StringUtils.substringBeforeLast(javaFileObject.getName(), ".java");
}

return super.inferBinaryName(location, javaFileObject);
}

请注意,我从末尾去掉了“.java”。在构造JavaFileObject时,文件名必须以“.java”结尾,但如果您稍后不去掉后缀,编译器将找不到您的类。

list() 稍微复杂一些,因为您必须小心谨慎地与委托(delegate)文件管理器配合使用。在我的实现中,我将完全限定类名映射到我可以迭代的 JavaFileObject 子类:

@Override
public Iterable<JavaFileObject> list(Location action, String pkg, Set<JavaFileObject.Kind> kind, boolean recurse) throws IOException {

Iterable<JavaFileObject> superFiles = super.list(action, pkg, kind, recurse);

// see if there's anything in our cache that matches the criteria.
if(action == StandardLocation.CLASS_PATH && (kind.contains(JavaFileObject.Kind.CLASS) || kind.contains(JavaFileObject.Kind.SOURCE))) {

List<JavaFileObject> ourFiles = new ArrayList<JavaFileObject>();
for(Map.Entry<String,InAppJavaFileObject> entry : files.entrySet()) {
String className = entry.getKey();
if(className.startsWith(pkg) && ("".equals(pkg) || pkg.equals(className.substring(0, className.lastIndexOf('.'))))) {
ourFiles.add(entry.getValue());
}
}

if(ourFiles.size() > 0) {
for(JavaFileObject javaFileObject : superFiles) {
ourFiles.add(javaFileObject);
}

return ourFiles;
}
}

// nothing found in our hash map that matches the criteria... return
// whatever super came up with.
return superFiles;
}

一旦您正确实现了这些方法,其余的就可以正常工作了。享受吧!

关于具有相互依赖的类的 Java Compiler API,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4302558/

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