如果我在包a.b.c中定义一个java类,但我只是将编译后的类文件放在c:\中 ,并使用URLClassloader加载它,会有错误吗?
修改------------------------------------------- ---------------
package amarsoft.rcp.base.util.test;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.io.Writer;
import javax.tools.JavaCompiler;
import javax.tools.ToolProvider;
public class JavaCompolierDemo {
/**
* @param args
* @throws IOException
*/
public static void main(String[] args) throws IOException {
// TODO Auto-generated method stub
String source = " package a.b.c; public class Test { public static void main(String args[]) { System.out.println(\"hello\"); } }";
// Save source in .java file.
File root = new File("C:\\java\\");
root.mkdir();
File sourceFile = new File(root, "\\Test.java");
Writer writer = new FileWriter(sourceFile);
writer.write(source);
writer.close();
// Compile source file.
JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
compiler.run(null, null, null, sourceFile.getPath());
}
}
当我运行上面的代码时,定义的包a.b.c将不会生成为目录a \ b \ c,Test.class将位于c:\ Test.class
答案 0 :(得分:1)
简短:是
更长:您确实需要将工作目录设置为文件夹a
的文件夹
(包含b
)包含在内。否则会在您询问时给出错误。
我的编辑:
您需要通过创建文件夹来自己创建包。并在该包中放入要编译的源文件。
File sourceFile = new File(root, "a\\b\\c\\Test.java");
sourceFile.getParent().mkdirs();
FileWriter fw = new FileWriter(sourceFile);
fw.write(source);
fw.flush();
fw.close();
....
如果您尝试编译不在正确软件包中的Java源代码,它将无法运行,您应该收到编译错误。我不得不承认我从未以这种方式编译源代码。
答案 1 :(得分:0)
如您所知,当您尝试加载a.b.c
时,它会查找文件a/b
的目录c
,因此如果该文件不存在,则无法找到它。
如果更改URLClassLoader以在另一个目录中查找该文件,则可以加载该类而不会出现错误。
你想做什么?
编辑:这是我几年前写的一个小编译器库的例子。它从内存中的String获取源代码,并为您提供已编译的外部类。
这使用编译器API来执行此操作。如果要调试代码,它会将其写入您指定的目录(这样您就可以逐步执行生成的代码),否则它将完全在内存中运行。