import java.net.*;public class Office {
public static void main(String[] args) throws Exception {
URL u=new URL ("file:/D:/JavaProj/ttt/src/");
URLClassLoader ucl=new URLClassLoader(new URL[] {u});
Class c =ucl.loadClass(args[0]);
Assembly asm =(Assembly) c.newInstance();
asm.start();

URL u1 =new URL("file:/D:/JavaProj/ttt/src/");
URLClassLoader ucl1=new URLClassLoader(new URL[] {u1}); 
Class c1=ucl1.loadClass(args[0]);
Assembly asm1=(Assembly) c1.newInstance();
         asm1.start(); }
}
我的结果:
--------------------Configuration: Test - jdk <Default> - <Default>--------------------
Word static initialization 
Word starts
Word startsProcess completed.书上的结果如下:
Word static initialization 
Word static initialization 
Word starts
Word starts

解决方案 »

  1.   

    D:/JavaProj/ttt/src/
    这个目录是不是在ClassPath里面你的意思是Word要被加载两次但是你的程序里面只有一次可能是ClassPath包含了这个路径所以Word被URLClassLoader的父Loader(AppLoader)加载了检查一下你的classpath
      

  2.   

    Assembly asm =(Assembly) c.newInstance();
    System.out.println(asm.getClass.getClassLoader()); //打印出实际工作的loader
      

  3.   

    Word static initialization 
    Word starts
    sun.misc.Launcher$AppClassLoader@1050169
    Word starts
    sun.misc.Launcher$AppClassLoader@1050169然后我修改第二个url为:
    URL u1 =new URL("file:/D:/JavaProj/ttt/");//少了“src/”
    结果依旧,怪事?
      

  4.   

    从结果不难看出呀,你的classloader没有加载类呀!你给一个随便的路径也无所谓呀
      

  5.   

    ClassLoader 默认工作机制是委托父Loader加载的,若父类加载不到该类,才由自己加载Assembly asm =(Assembly) c.newInstance();
    System.out.println(asm.getClass.getClassLoader()); 我要你加上这一句 打印出到底是谁加载的Word类不就一目了然了
      

  6.   

    sun.misc.Launcher$AppClassLoader@1050169看到没有实际加载的Word的是AppClassLoader这个AppClassLoader就是你定义的两地URLLoader的父类问题出在D:/JavaProj/ttt/src/
    这个目录在你的Classpath里面要解决可以由两种方法1. 把D:/JavaProj/ttt/src/从你的ClassPath里面删除2.
      URLClassLoader ucl = new URLClassLoader(new URL[] {u} ,null);
      这样定义你的URLClassLoader 
       让它的父loader为空关键是你要明白内部原理书上的Word.class肯定不再ClassPath里面 
      

  7.   

    问题找到了:
    我的Word.class在Office.java目录有一份,并且在Url里面也有一份,我目的是要执行url里的,可是程序主目录下就有,Jdk按照它的寻找顺序自然而然的找到了程序主目录下的,所以达不到测试目的,不会执行类的静态初始化代码2次,但是这里还有个问题,java.net.URLClassLoader@11a698a里面为什么是java.net.URLClassLoader?并且@后面的11a698a为什么是相同的,它的含义是什么?
      

  8.   

    java.net.URLClassLoader@11a698a就是这个对象的类名加hashCodejava.net.URLClassLoader是类名
    11a698a 是这个对象的hashCode(也就是内存地址)为什么一样 那要看看你的程序了
      

  9.   

    请问 那“对象的hashCode“一样的理由要怎么看程序啊?
      

  10.   

    URLClassLoader ucl=new URLClassLoader(new URL[] {u});
    System.out.println(ucl);打印出来看看