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
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
这个目录是不是在ClassPath里面你的意思是Word要被加载两次但是你的程序里面只有一次可能是ClassPath包含了这个路径所以Word被URLClassLoader的父Loader(AppLoader)加载了检查一下你的classpath
System.out.println(asm.getClass.getClassLoader()); //打印出实际工作的loader
Word starts
sun.misc.Launcher$AppClassLoader@1050169
Word starts
sun.misc.Launcher$AppClassLoader@1050169然后我修改第二个url为:
URL u1 =new URL("file:/D:/JavaProj/ttt/");//少了“src/”
结果依旧,怪事?
System.out.println(asm.getClass.getClassLoader()); 我要你加上这一句 打印出到底是谁加载的Word类不就一目了然了
这个目录在你的Classpath里面要解决可以由两种方法1. 把D:/JavaProj/ttt/src/从你的ClassPath里面删除2.
URLClassLoader ucl = new URLClassLoader(new URL[] {u} ,null);
这样定义你的URLClassLoader
让它的父loader为空关键是你要明白内部原理书上的Word.class肯定不再ClassPath里面
我的Word.class在Office.java目录有一份,并且在Url里面也有一份,我目的是要执行url里的,可是程序主目录下就有,Jdk按照它的寻找顺序自然而然的找到了程序主目录下的,所以达不到测试目的,不会执行类的静态初始化代码2次,但是这里还有个问题,java.net.URLClassLoader@11a698a里面为什么是java.net.URLClassLoader?并且@后面的11a698a为什么是相同的,它的含义是什么?
11a698a 是这个对象的hashCode(也就是内存地址)为什么一样 那要看看你的程序了
System.out.println(ucl);打印出来看看