使用Toolprovider编译类并使用ClassLoader加载它们

时间:2011-08-25 11:26:13

标签: java classloader urlclassloader

我正在尝试加载我在运行时生成编译的类。我可以编译它们而没有任何问题:

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?)

没有成功(我不明白这些......)。你可以帮助我或给出一个简单的例子来做这个,这样我就能形成它吗?

提前致谢。

2 个答案:

答案 0 :(得分:1)

你的最后一次尝试应该有效。 myUrl应该引用包含生成的.class的目录(或Jar)。

myUrl = new URL("file:///myGeneratedCode/");

网址必须以"/"结尾才能被视为目录,否则,它将采用Jar文件。

答案 1 :(得分:0)

我终于找到了'问题'。这是我身边的一个愚蠢错误:我试图在关闭之前编译生成的java文件。令人烦恼的是,JavaCompiler没有抛出任何异常。

解决这个问题并生成类我没有更多问题加载它与ClassLoader

再次感谢。