我正在尝试加载我在运行时生成编译的类。我可以编译它们而没有任何问题:
JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
StandardJavaFileManager fileManager = compiler.getStandardFileManager(null, null, null);
List<File> sourceFileList = new ArrayList<File>();
sourceFileList.add(new File(sourceFile));
Iterable<? extends JavaFileObject> compilationUnits = fileManager.getJavaFileObjectsFromFiles(sourceFileList);
CompilationTask task = compiler.getTask(null, fileManager, null, null,null, compilationUnits);
但我不明白如何加载我编译的类(或编译的地方)以供后用法使用。我尝试了几件事:
Class type = ClassLoader.getSystemClassLoader().loadClass(className);
或
ClassLoader loader = URLClassLoader.newInstance(new URL[] { myUrl }, getClass().getClassLoader()); //(URL?)
没有成功(我不明白这些......)。你可以帮助我或给出一个简单的例子来做这个,这样我就能形成它吗?
提前致谢。
答案 0 :(得分:1)
你的最后一次尝试应该有效。 myUrl
应该引用包含生成的.class的目录(或Jar)。
myUrl = new URL("file:///myGeneratedCode/");
网址必须以"/"
结尾才能被视为目录,否则,它将采用Jar文件。
答案 1 :(得分:0)
我终于找到了'问题'。这是我身边的一个愚蠢错误:我试图在关闭之前编译生成的java文件。令人烦恼的是,JavaCompiler没有抛出任何异常。
解决这个问题并生成类我没有更多问题加载它与ClassLoader
再次感谢。