- 我有一個類A擴展B.
- 我創建了一個CustomClassLoader擴展ClassLoader使用
defineClass(className, byte[], offset, length)
。 - 我已經instanciate a
new CustomClassLoader(Thread.currentThread().getContextClassLoader())
。 因此,我的CustomClassLoader的父級是當前線程的ClassLoader。 - 我使用ASM框架修改了B類。我已將修改後的類寫入.class文件,並使用反編譯器確保它可以正常工作。它的工作原理。
- 我已將修改後的B類添加到我的CustomClassLoader中
- 我已經使用我的CustomClassLoader設置了
Thread.currentThread().setContextClassLoader()
。 - 我已經使用
Class.forName(String, true, the CustomClassLoader)
加載A. - 但是加載的B類似乎是原始類。
我錯了什麼? 如果您需要更多信息,詳細的主題在我的GitHub上。如何在Java中加載修改的超類?
「A」類未加載,因此ClassLoader子代表將一個類加載到ClassLoader父類。 但是B被加載到子中(修改後的版本被加載到子中),所以當A需要B時,因爲A擴展了B爲什麼B是從父加載的(加載原始的)? –
你的意思是「但是B裝在小孩身上」?如果B存在於父類加載器中,那麼它不會加載到子類中,因爲沒有重載'loadClass'的每個類加載器首先委託給它的父類,並且只會嘗試將它加載到子類classlaoder中,如果它未找到父 –
我必須在運行時更改B類字節碼。 因此,爲了保存我修改過的B類,我必須使用child.defineClass(),因爲parent.defineClass()不可見,並且原始B類可能存在於父類加載器中。 - B被修改,並裝載到子 - A從子加載 - >委託給父 - A延伸乙 - B似乎是從父 加載 - B不保存到母體,因此父裝載B使用URL我認爲 - 父裝入原始B類 - B裝載兩次:原始在父母和修改在孩子。 –