您的位置:首页 > 其它

URLClassLoader加载类的路径

2014-06-10 17:24 274 查看
先看用java命令执行程序的一个例子:

写一个类A.java,编译生成A.class文件:

package aaa.bbb;
class A {}

(1)将A.class文件放置在D:/下,进入D:/,执行“java A”命令,出错:



(2)将A.class放置在D:/aaa/bbb/下,进入D:/aaa/bbb/,执行“java A”,报错同上。

(3)将A.class放置在D:/aaa/bbb/下,在D:/下执行“java aaa/bbb/A”或”java aa.bbb.A“,成功。

java文件里面加了package,那么类的全名其实就是“包名.类名”,因此第一种测试,在当前目录下(classpath)存在一个名为aaa.bbb.A的类文件,而不是参数中的A,因此提示wrong
name。所以java命令中的参数与类全名(即包名+类名)必须是一致的!!且执行java命令的目录应在package的目录层次之外。

对URLClassLoader中URL加载路径的指定也是如此,将上述的A.class放置在D:/aaa/bbb下,再写一个类B.java,编译后B.class放在E:/下:

import java.net.*;
import java.io.*;

public class B {
public static void main(String[] args) throws Exception {
URL u = new URL("file:/D:/aaa/bbb/");
URLClassLoader loader = new URLClassLoader(new URL[] {u});
Class c = loader.loadClass(args[0]);
}
}

进入E:/,执行”java B A“,提示找不到类,错误如下:



因为程序中指定的加载路径为”file:/D:/aaa/bbb/“,该路径下有一个名为”aaa.bbb.A“的类,而参数中指定的是”A“,因此会提示wrong name。如果执行”java B aaa.bbb.A“,依然会出现上述错误,因为此时的搜索路径为”file:/D:/aaa/bbb/aaa/bbb/A“。正确的路径不应该包含类的包目录,就像执行java命令一样,因此应将程序中URL参数更改为”file:/D:/“,然后执行”java B aaa.bbb.A“即可成功加载类。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: