import java.net.*;
public class ac {
public static void main(String[] args) {
try {
URL u = new URL("file:/d:/nnn/a/b/c");
ClassLoader loader = new URLClassLoader (new URL[]{u});
Class cla = loader.loadClass("ac"); //ac这个类是属于a.b.c包里的,我把上面URL的构造函数改成file:/d:/nnn,然后这里写a.b.c.ac报错说找不到类!
System.out.println("加载成功");
System.out.println(cla.getName());

URL u2 = new URL("file:/d:/nnn/a/b/c");
ClassLoader c = new URLClassLoader(new URL[]{u2});
Class ac = c.loadClass("ac");
System.out.println(ac == cla); //这两个类是不同的加载器加载的,这里为什么会输出TRUE?

System.out.println(c.getClass().getClassLoader()); //下面这三个,为什么输出全是NULL?
System.out.println(cla.getClass().getClassLoader());
                        System.out.println(ac.getPackage()); //ac这个类是有包的啊!为什么会是NULL? } catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
}
}
}
书上没把我讲明白。。谢谢回答!

解决方案 »

  1.   

    一开始我想会不会是这个类和d:/a/b/c目录下的那个类重名的原因
    我就把这个类的名字改了。
    这不改不要紧 一改就报错了。根本连输出都没有了
    java.lang.ClassNotFoundException: ac
    at java.net.URLClassLoader$1.run(Unknown Source)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(Unknown Source)
    at java.lang.ClassLoader.loadClass(Unknown Source)
    at java.lang.ClassLoader.loadClass(Unknown Source)
    at acaaa.main(acaaa.java:7)
      

  2.   

    URL u = new URL("file:/d:/nnn");
                ClassLoader loader = new URLClassLoader (new URL[]{u});
                Class cla = loader.loadClass("a.b.c.ac"); 记住,包名是作为类名的一部分的
      

  3.   

    这样写也不行的。
    还是报错
    java.lang.ClassNotFoundException: a.b.c.ac
    at java.net.URLClassLoader$1.run(Unknown Source)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(Unknown Source)
    at java.lang.ClassLoader.loadClass(Unknown Source)
    at java.lang.ClassLoader.loadClass(Unknown Source)
    at aca.main(aca.java:7)
      

  4.   

    System.out.println(c.getClass().getClassLoader()); //下面这三个,为什么输出全是NULLc.getClass返回的是Class类型,Class是api自己的,是由bootstrap加载,好像是c写的,所以没有一个具体的java概念的Loader,返回null
    你可以试试ac.getClassLoader()
      

  5.   

    URL   u   =   new   URL("file:/d:/nnn"); 
    这个改了没有
      

  6.   

    晕了!
    原来在工程里有一个叫ac的类
    我把它删了以后用
                URL u = new URL("file:/d:/nnn/a/b/c");
                ClassLoader loader = new URLClassLoader (new URL[]{u});
                Class cla = loader.loadClass("ac");
    这种方式加载也报错了。
    用你说的那种方式还是报错
      

  7.   

    System.out.println(c.getClass().getClassLoader());   //下面这三个,为什么输出全是NULL c.getClass返回的是Class类型,Class是api自己的,是由bootstrap加载,好像是c写的,所以没有一个具体的java概念的Loader,返回null 
    你可以试试ac.getClassLoader()
    =========================================================================
    不好意思
    这里写错了
    应该是ac.getClass().getClassLoader()
      

  8.   

    这个测试的类没有包。
    那个要被加载的类有包的啊
    package a.b.c;
    public class ac{
    public String username = "123456";
    public String password = "11111";}
    在d:\nnn\a\b\c目录下
      

  9.   

    当然确定啦
    我现在怀疑是我机子的问题。
    今天早上有个问题。我在我机子上写例子 怎么运行都报错
    上公司电脑上 就没错。
    就是这个:
    http://topic.csdn.net/u/20080108/22/5c356d8b-102d-4f21-acb5-f6f8e53c80ee.html