java包是否影响运行时行为?

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

如果我在包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

正如您所知,当您尝试加载
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中,你可以决定从何处加载文件。从标准位置加载文件可能是最简单的,但您可以从任何地方加载文件,甚至从内存加载。“自己创建包”,但这不是必需的,不是吗?这是必需的。但我从来没有这样编译过源代码。。。所以可能还有其他规则。