jvm學習08 複雜類中自定義類載入器

2021-10-01 15:04:27 字數 2863 閱讀 6858

通過分析可以發現:呼叫classloader類的loadclass()方法載入乙個類,並不是對類的主動使用,不會導致類的初始化,因此建構函式就不會執行。

呼叫classloader類的loadclass()方法載入乙個類,並不是對類的主動使用,不會導致類的初始化。但是通過反射獲取乙個類,是對類的主動使用,會對類初始化。所以mysample類的建構函式會執行,進而mycat的建構函式也會執行。

public

class

mycat

}

public

class

mysample

}

public

class

mytest6

}

如果將mycat.class檔案和mysample.class檔案都刪除,

然後將其存放在桌面的c:\users\hh\desktop\com\jvm\類載入器檔案中。

現在將mycat.class檔案刪除,保留mysample.class檔案,但是桌面上都有這兩個檔案:

由於classpath類路徑下面有mysample.class檔案,所以就會由應用類載入器去載入,載入成功後,通過反射建立類的例項,是對類的主動使用,因此mysample類中的建構函式會執行,會嘗試載入mycat.class檔案,但是classpath路徑下的mycat.class已經刪除,所以系統類載入載入不了,報了異常。

注意:載入mycat類的類載入器就是載入mysample類的類載入器,也就是系統類載入器,但是系統類載入器載入不了,他的父親載入器也載入不了,就會報錯。

將my******.class檔案刪除,保留mycat.class檔案

然後將其存放在桌面的c:\users\hh\desktop\com\jvm\類載入器檔案中。

載入mysample類的類載入器為自定義類載入器,載入mycat類的類載入器就是載入mysample類的類載入器,但是載入mycat類的類載入器不會自己去載入,而是委託他的父親系統類載入器去載入,父親類載入器能載入成功,因此就會載入。

public

class

mycat

}

public

class

mysample

}

現在將mycat.class檔案重新複製到桌面,然後刪除classpath下面的這個檔案:

父載入器所載入的類無法訪問到子載入器所載入的類,mysample類是由系統類載入器載入的,mycat類是由自定義類載入器所載入的,所以在mycat類中無法訪問到mysample類中載入到的資訊。

在mysample類中加入一句話:system.out.println("from mycat:"+mycat.class);

子載入器所載入的類能夠訪問到父載入器所載入的類,mysample類由自定義類載入器載入,mycat類由系統類載入器載入,因此mycat類可以訪問到mysample類中的資訊。

子載入器所載入的類能夠訪問到父載入器所載入的類

父載入器所載入的類無法訪問到子載入器所載入的類

不同類載入器之間的命名空間的關係:

同乙個命名空間內的類時相互可見的。子載入器的命名空間包含所有父載入器的命名空間,因此,子載入器載入的類能看到所有父載入器載入的類。

由父載入器載入的類不能看到子載入器載入的類,如果兩個載入器之間沒有直接或間接的父子關係,那麼他們各自載入的類相互不可見。

Python學習(十一) 自定義類

已經兩天沒更新了,這兩天比較心煩氣燥,什麼都看不下去,學不下去,大概是 大姨父 來了 自定義類有兩種語法格式 class classname suit 這種語法格式不指定基類,在python中,不指定基類的話,預設的基類就是object。所以在python中,所有的類都是object的子類。如果要指...

C 中自定義異常類

c 中自定義異常類 建立自定義異常類應嚴格遵循幾個原則 1.宣告可序列化 用於進行系列化,當然如果你不需要序列化。那麼可以不宣告為可序列化的 2.新增乙個預設的建構函式 3.新增包含message的建構函式 4.新增乙個包含message,及內部異常型別引數的建構函式 5.新增乙個序列化資訊相關引數...

在objective c中列印自定義類

nsstring description 是基類nsobject 所帶的方法,在自定義的子類中,我們可以過載該方法來實現列印自定義類。首先,我們可以自定義乙個person類。inte ce person nsobject end implementation person id init retur...