gpt4 book ai didi

java - 编译器未调用自定义 JavaFileManager 的 getJavaFileForOutput(...) 方法

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:09:54 26 4
gpt4 key购买 nike

我有一个看起来像这样的自定义 JavaFileManager:

public class InMemoryForwardingFileManager extends ForwardingJavaFileManager<StandardJavaFileManager> {

private final Map<String, ByteArrayJavaFileObject> javaFileObjects = new HashMap<>();

@Override
public JavaFileObject getJavaFileForOutput(Location location, String className, Kind kind, FileObject sibling) throws IOException{

JavaFileObject fileObject = new ByteArrayJavaFileObject( ... );
javaFileObjects.put(className, fileObject);

return fileObject;
}


@Override
public ClassLoader getClassLoader(Location location){

return new SecureClassLoader(InMemoryForwardingFileManager.class.getClassLoader()){

@Override
protected Class<?> findClass(String name) throws ClassNotFoundException {

ByteArrayJavaFileObject fileObject = javaFileObjects.get(name);

if(fileObject != null){
byte[] bytes = fileObject.getBytes();
return defineClass(name, bytes, 0, bytes.length);
} else{
throw new ClassNotFoundException();
}

}

}

}
}

出于可读性目的,我已经编辑了很多代码;该类还实现了 list(...) 方法和 inferBinaryName(...) 方法。

在我项目的另一个区域,我运行了类似于以下的东西:

InMemoryForwardingFileManager fileManager = // get singleton instance

... // declare compilation units, options, diagnostic listener, etc

JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
CompilationTask compilerTask = compiler.getTask(null, fileManager, diagnostics, compilationOptions, null, compilationUnits);
compilerTask.call();

// load and instantiate the compiled class
ClassLoader classLoader = fileManager.getClassLoader(null);
MyGeneratedClass instance = (MyGeneratedClass) classLoader.loadClass(fullClassName).newInstance();

如果我在 windows/mac/linux 上的 eclipse 中运行一些 junit 测试,它会完全按照我的预期工作。如果我在 Windows 上的 glassfish 中运行我的项目,它也完全符合我的预期。如果我在 Mac OS X Mavericks 或 Centos 6.4 上的 glassfish 中运行同一个项目,则根本不会调用 getJavaFileForOutput(...) !我的文件管理器的 getClassLoader(...) 方法最终被调用,但为时已晚。

阻止调用 getJavaFileForOuput 方法的 linux+glassfish 环境有何独特之处?

我很确定我已正确设置所有环境以使用相同的 jdk 版本:jdk1.7.0_45。

有什么建议吗?

最佳答案

我会在这里回答我自己的问题。

我不敢相信这超出了我的想象,但事实证明 Windows 环境使用的是 glassfish3,而其他环境使用的是 glassfish4。发现这一点后,我使用 glassfish4 在 Windows 上测试了该项目,并且能够重现我在 mac/linux 上遇到的相同问题。

虽然这模糊地回答了我的问题,但如果我发现上述代码在 glassfish4 中无法按预期工作的确切原因,我将在此处添加解释。

关于java - 编译器未调用自定义 JavaFileManager 的 getJavaFileForOutput(...) 方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19895550/

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