關於類載入

2021-09-24 15:52:16 字數 1748 閱讀 9117

本文不做概念和理論解釋、直接上**

假設現有jar包foo-1.0.0.jar

package com.oliver.entity;

public class a

// 此處省略n個方法

public object ***(){}

}

假設現有jar包bar-1.0.0.jar

public class b

// 此處省略n個方法

public object yyy(){}

}

case1:

此種情況下:因為兩個jar分別被不同的classloader載入,並且a的構造器內依賴於了另乙個jar包的類b。所以,child.loadclass("com.oliver.entity.a");該行**的執行是沒問題,但是緊接著下一行的clas.newinstance()就會classnotfound了。

@test

public void fun() throws throwable);

urlclassloader child = new urlclassloader(new url, parent);

// urlclassloader child = new urlclassloader(new url, parent);

class<?> clas = child.loadclass("com.oliver.entity.a");

clas.newinstance();

}

case2:

此種情況下:雖然我們將foopath也指定為了child的類載入路徑,但是由於父載入路徑內已經存在了,所以當尋找類b的時候,又會classnotfound,因為不可以違背雙親委派(偏偏tomcat的類載入器的設計違背了雙親委派,也僅僅只是最後一層webclassloader違背了)child.loadclass("com.oliver.entity.a");該行**的執行是沒問題,但是緊接著下一行的clas.newinstance()就會classnotfound了。

@test

public void fun() throws throwable);

// urlclassloader child = new urlclassloader(new url, parent);

urlclassloader child = new urlclassloader(new url, parent);

class<?> clas = child.loadclass("com.oliver.entity.a");

clas.newinstance();

}

case3:

此種情況下:如此以來,就可以解決了

@test

public void fun() throws throwable);

// urlclassloader child = new urlclassloader(new url, parent);

urlclassloader child = new urlclassloader(new url, parent);

class<?> clas = child.loadclass("com.oliver.entity.a");

clas.newinstance();

}

關於類的靜態載入順序

關於類中靜態變數和靜態方法以及構造方法之類的載入順序問題現在成了面試中的基本問題,今天閒來無事,就寫一篇部落格來記述一下。package com.cn.bb public class testparentstatic private static string staticfield 父類靜態變數 ...

關於類的載入機制總結

關於類的載入機制 首先我們要知道類載入機制的原理是什麼?1.啟動jvm 2.將需要執行的class檔案載入到虛擬機器記憶體中 3.找到主類,開始執行主函式 然後又是如何將class檔案載入到jvm記憶體中的?載入步驟 1.先委託父類載入類,如果父類已經載入,就不需要再次載入,如果父類沒有載入,再由本...

關於類的載入面試題

1.類的載入 當第一次建立該 類物件的時候,載入到記憶體當中,在載入時,會執行static 2.欄位初始化問題 2.1 靜態字段初始化 是在靜態 塊當中初始化 2.2 非靜態的字段初始化 它是在構造器當中做的初始化 3.子類構造器缺省會呼叫父類的構造器 載入的順序 1 1 2 構造器supercla...