84669 人學習
152542 人學習
20005 人學習
5487 人學習
7821 人學習
359900 人學習
3350 人學習
180660 人學習
48569 人學習
18603 人學習
40936 人學習
1549 人學習
1183 人學習
32909 人學習
我知道在JVM识别类的方式是通过classLoader和全类名识别的,那么当一个类由两个不同的classLoader加载后。对这个类初始化时,JVM会选择对哪个类进行初始化?其依据是什么?两个classLoader加载的Class对象在内存中的位置有什么区别吗?
例如:
有人提出看工程结构,我把加载器和被加载对象的结构放出来吧:
被加载的类也是在classpath下的
簡單來說是這樣的:
1、ClassLoad可以有很多,而且它们之间存在层级关系,最顶层的叫做BootClassLoad。 2、每层ClassLoad都用自己的工作范围。 3、每个ClassLoad中都有一个上级ClassLoad的引用。 4、当某一个ClassLoad开始工作时(加载Class),他会首先调用上级ClassLoad来Load Class,层层向上,直到顶层。 5、只有当上级ClassLoader没能在职责范围内Load到指定Class时,下级ClassLoader才会在自己的职责范围内来Load。
更多內容,搜尋引擎檢索關鍵字「雙親委派模型」即可。
偏題了 我覺得這程式碼很工整 看上去很舒服
這裡的初始化可以理解為,類別載入的最後一步(呼叫),如果是两个不同的ClassLoad加载的话那么会被执行两次,加载的Class对象在方法区(永久代),并且会对应两个Class物件.
Class
如果是重載findClass方法代码运行出来的结果最后应该是两个true.上述代码,因为class文件最终是在classpath下,所以都是交给AppLoader去加载,如果需要呈现效果,需要把class文件挪一个位置,挪到不在classpath.楼主是重载loadClass方法
findClass
true
class
classpath
loadClass
簡單來說是這樣的:
更多內容,搜尋引擎檢索關鍵字「雙親委派模型」即可。
偏題了 我覺得這程式碼很工整 看上去很舒服
這裡的初始化可以理解為,類別載入的最後一步(呼叫
),如果是两个不同的ClassLoad加载的话那么
会被执行两次,加载的Class
对象在方法区(永久代),并且会对应两个Class
物件.如果是重載
findClass
方法代码运行出来的结果最后应该是两个true
.上述代码,因为class
文件最终是在classpath
下,所以都是交给AppLoader去加载,如果需要呈现效果,需要把class
文件挪一个位置,挪到不在classpath
.楼主是重载loadClass
方法