一个JVM实例只有一个方法区,里面放了一些类信息。但是bootstrap的路径 jre/classes下 有 study.test
appClassloader的路径下也有study.test现在我先用appClassloader加载 study.test,然后在用bootstrap加载study.test.这样方法区中就有两份 study.test类信息。但是它们的全限定名都是study.test,请问加载的时候是如何区分它们的?
appClassloader的路径下也有study.test现在我先用appClassloader加载 study.test,然后在用bootstrap加载study.test.这样方法区中就有两份 study.test类信息。但是它们的全限定名都是study.test,请问加载的时候是如何区分它们的?
如果你的classpath=.;这么写,那当然先访问你自己的啦-------------------------------
java菜鸟学堂QQ群144648357
在bootstrap路径下放个study.test那样就是用bootstrap加载的了,bootstrap为null获取了也没用
不管怎么说先谢谢你的回答,不过请你回答前先看清问题。这里不管classpath怎么配置,类加载器的祖先都是bootstrap
但是jvm不至于什么类都加载吧,难道要将所有的类加载吗
这里是他写的自定义类,jvm还不至于连楼主的类也加载进去吧
除非楼主想覆盖掉原有的加载类,不过这样肯定是报错的
因为如果能写出来,那也不会在这里混了,呵呵
bootstrap不能加载,就会向下寻找extend加载器然后系统加载器(应用加载器),关键是只能加载1次。即便是7楼说的用自己写的类加载器,它默认也是系统加载器的子加载器,一样会往上找,最终只能被一个定义类加载器加载
而且,使用父加载器只是默认的原则,除了bootstrap加载器无法跳过外,其它的可以跳过,由自己加载这个类(即使父加载器是可以加载这个类)
我在study.test类写了静态块代码,如果类第一次被加载静态块会被执行。所以我在"java.class.path"下放置study.test,删掉"sun.boot.class.path"下的study.test.这样study.test肯定被appclassloader加载。暂停10s,把study.test放到"sun.boot.class.path".再加载一次,发现静态块代码代码被执行了两次。说明这个类被加载了两次