读书人

JVM加载.class资料机制

发布时间: 2012-11-07 09:56:10 作者: rapoo

JVM加载.class文件机制

    ?JVM加载.class资料机制JVM加载.class资料机制
        ?JVM加载.class资料机制JVM加载.class资料机制
            ?JVM加载.class资料机制JVM加载.class资料机制
                ?JVM加载.class资料机制JVM加载.class资料机制
                    ?JVM加载.class资料机制JVM加载.class资料机制
                        ?JVM加载.class资料机制JVM加载.class资料机制
                          URL url = null; try { url = new URL("file:/E:/JAVA/MyProject/string/"); } catch (MalformedURLException e) { e.printStackTrace(); } URLClassLoader cl = new URLClassLoader(new URL[]{url}); URLClassLoader cl1 = new URLClassLoader(new URL[]{url}); try { Class tempClass = cl.loadClass("ClassLoaderTest1"); Class tempClass2 = cl.loadClass("ClassLoaderTest2"); Object test = tempClass.newInstance(); System.out.println(tempClass.getClassLoader()); System.out.println(tempClass2.getClassLoader()); } catch (Exception e) { e.printStackTrace(); }

                          ?
                          当ClassLoaderTest1,ClassLoaderTest2在当前目录和E:/JAVA/MyProject/string/都存在的时候输出为sun.misc.Launcher$AppClassLoader@1050169
                          sun.misc.Launcher$AppClassLoader@1050169
                          即都是被AppClassLoader加载的, 即使在E:/JAVA/MyProject/string/下面也存在.

                          当ClassLoaderTest1,ClassLoaderTest2只在E:/JAVA/MyProject/string/下存在的时候输出为
                          java.net.URLClassLoader@480457
                          java.net.URLClassLoader@1a7bf11
                          即都是被自定义的加载器加载的,并且也可以Object test = tempClass.newInstance();

                          下面一的是最关键的,因为ClassLoaderTest1需要用到ClassLoaderTest2,如果ClassLoaderTest2被AppClassLoader加载,而ClassLoaderTest1是被自定义的类加载器加载,就会出现如下错误:

                          java.lang.IllegalAccessError: tried to access class ClassLoaderTest2 from class ClassLoaderTest1
                          at ClassLoaderTest1. <init>(ClassLoaderTest1.java:6)
                          at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
                          at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39)
                          at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27)
                          at java.lang.reflect.Constructor.newInstance(Constructor.java:274)
                          at java.lang.Class.newInstance0(Class.java:308)
                          at java.lang.Class.newInstance(Class.java:261)
                          at ClassLoaderTest.main(ClassLoaderTest.java:43)

读书人网 >编程

热点推荐