java包会影响运行时行为吗?

时间:2011-10-08 09:32:34

标签: 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.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

2 个答案:

答案 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获取源代码,并为您提供已编译的外部类。

http://essence.svn.sourceforge.net/viewvc/essence/trunk/essence-file/src/test/java/org/freshvanilla/compile/CompilerTest.java?revision=293&view=markup

这使用编译器API来执行此操作。如果要调试代码,它会将其写入您指定的目录(这样您就可以逐步执行生成的代码),否则它将完全在内存中运行。