java包是否影响运行时行为?
如果我在包a.b.c中定义了一个java类,但我只是将编译后的类文件放在c中:\ ,并使用URLClassloader加载,是否会出现错误 编辑---------------------------------------------java包是否影响运行时行为?,java,package,Java,Package,如果我在包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.Wri
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正如您所知,当您尝试加载
a.b.c
时,它将在目录a/b
中查找文件c
,因此如果文件不在那里,它将找不到它
如果将URLClassLoader更改为在另一个目录中查找该文件,则它可以加载该类而不会出错
你想干什么
编辑:这是我几年前写的一个小型编译器库的示例。它从内存中的字符串中获取源代码,并为您提供已编译的外部类
这使用编译器API来完成。如果您想调试代码,它会将代码写入您指定的目录(这样您就可以单步执行生成的代码),否则它将完全在内存中工作。Short:Yes 更长:您确实需要将工作目录设置为文件夹
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源代码,但它不在正确的包中,那么它将不起作用,您应该会得到一个编译错误。我必须承认,我从来没有这样编译过源代码。你能举个例子说明你所问的问题吗?我正在尝试使用JavaCompiler来支持在运行时编译java源代码。在这个API中,你可以决定从何处加载文件。从标准位置加载文件可能是最简单的,但您可以从任何地方加载文件,甚至从内存加载。“自己创建包”,但这不是必需的,不是吗?这是必需的。但我从来没有这样编译过源代码。。。所以可能还有其他规则。