JAVA類載入機制以及如何自定義類載入器

2021-09-02 15:50:46 字數 1379 閱讀 5982

雙親委派機制描述

本文主要以tomcat7為例說明類載入機制,大家也可以參考tomcat7的類載入機制的官方文件。tomcat7總的classloader結構如下圖:

各個類載入器載入類的範圍:

載入順序預設如下

如果設定了,載入順序如下:

jdk的解釋是這樣的:

並不是給執行緒設定了contextclassloader,這個執行緒下載入的類就都使用該contextclassloader。contextclassloader的用途是提供乙個途徑,使得執行緒執行時可以隨時獲得指定的contextclassloader進行類的載入,通過這個這種方式可以避開雙親委派模型,最典型的應用是jdbc、jndi。

自定義的classloader通過繼承classloader來實現,也可以使用urlclassloader更簡單。如果需要改寫類的載入過程最好覆蓋findclass()而不是loadclass(),loadclass()是為了保持jdk1.2之前的相容。使用findclass()能保證不會違背雙親委派模式。

如何使用自定義的classloader new出物件呢?前面說過的setcontextclassloader是不對的,必須用自定義的classloader,通過反射例項化乙個初始類,由該初始類載入的其他類就都會使用自定義的classloader了。可以分析一下tomcat的**:

class

>

startupclass

= catalinaloader.loadclass

("org.apache.catalina.startup.catalina");

object startupinstance = startupclass.newinstance();

通過反射機制呼叫startupinstance的方法,之後的類就會都有自定義的classloader載入,當然有個前提就是不能違背雙親委派模型——自定義的classloader載入的類在父classloader載入的類中不存在。為什麼要這麼做?類載入的時候有乙個規律,被載入類使用呼叫者所用的classloader進行類的載入。可以通過class.forname()的**得到這個結論:

public static class> forname(string classname)

throws classnotfoundexception

java類載入機制

載入類時,每個類載入器總是首先將家在任務交給父類載入器,若父類載入器載入不到,自己才去載入 bootstrap loader時最頂級的載入器,其父載入器為null test test new test 11j class testclass test.getclass classloader cla...

Java類載入機制

解析階段是虛擬機器將常量池內的符號引用替換為直接引用的過程。符號引用 symbolic reference 符號引用以一組符號來描述所引用的目標,符號引用可以是任何形式的字面量,符號引用與虛擬機器實現的記憶體布局無關,引用的目標並不一定已經在記憶體中。直接引用 direct reference 直接...

Java類載入機制

在虛擬機器的生命週期中乙個類只被載入一次。類載入的原則 延遲載入,能少載入就少載入,因為虛擬機器的空間是有限的。類載入的時機 1 第一次建立物件要載入類.2 呼叫靜態方法時要載入類,訪問靜態屬性時會載入類。3 載入子類時必定會先載入父類。4 建立物件引用不載入類.5 子類呼叫父類的靜態方法時 1 當...