retransformclasses
void retransformclasses(class... classes)
throws unmodifiableclassexception
- 重 轉換 提供的類集。
-
此函數為檢測已加載類提供了方便。 當最初加載了類或重定義了類時,初始類文件字節可以使用
classfiletransformer
轉換。 此函數返回轉換進程(以前是否發生過轉換)。 此轉換按以下步驟進行:從初始類文件字節開始
對於每個添加時
canretransform
設為 false 的轉換器,上一次類加載或重定義期間transform
返回的字節將被重新用於轉換的輸出;注意,這等價於不做更改地重新應用前一個轉換;沒有調用transform
的情況除外。對於每個添加時
canretransform
設為 true 的轉換器,在這些轉換器中調用transform
方法轉換的類文件字節將作為類的新定義安裝
轉換的順序在
transform
方法中描述。在自動重新應用不可重轉換的轉換時,也將使用這一順序。最初的類文件字節表示(應用轉換前)傳遞給
classloader.defineclass
或redefineclasses
的字節,但有可能不完全匹配。常量池的布局或內容可能不同。常量池的條目可能多一些或少一些。常量池條目的順序可能不同,但是,方法字節碼中常量池的索引將是對應的。一些屬性可能不存在。在順序沒有意義的地方(例如,方法的順序),可能不保留順序。此方法在一個集合上操作,以便允許同時對多個類進行相互依賴的更改(重轉換類 a 要求重轉換類 b)。
如果重轉換的方法有活動的堆棧幀,那么這些活動的幀將繼續運行原方法的字節碼。重轉換的方法將用於新的調用。
此方法不會引起任何初始化操作,jvm 慣例語義下發生的初始化除外。換句話說,重定義一個類不會引起其初始化方法的運行。靜態變量的值將與調用之前的值一樣。
重轉換類的實例不受影響。
重轉換可能會更改方法體、常量池和屬性。重轉換不得添加、移除、重命名字段或方法;不得更改方法簽名、繼承關系。在以后的版本中,可能會取消這些限制。在應用轉換之前,類文件字節不會被檢查、驗證和安裝。如果結果字節錯誤,此方法將拋出異常。
如果此方法拋出異常,則不會重轉換任何類。
此方法旨在用於檢測,正如類規范所述。
-
- 參數:
-
classes
- 要轉換的類 數組; 允許 長度為 0 數組,在這種情況下,此方法不執行任何操作 - 拋出:
-
unmodifiableclassexception
- 如果不能 修改指定的類(ismodifiableclass(java.lang.class>)
返回false
) -
unsupportedoperationexception
- 如果 jvm 的當前 配置不允許重轉換(isretransformclassessupported()
為 false),或者重轉換試圖做出不受支持的更改 -
classformaterror
- 如果 數據不包含有效的類 -
noclassdeffounderror
- 如果類文件中的名稱不等於類的名稱 -
unsupportedclassversionerror
- 如果類文件版本號不受支持 -
classcircularityerror
- 如果新類包含 循環 -
linkageerror
- 如果發生 鏈接錯誤 -
nullpointerexception
- 如果提供的類數組或其任意組件為null
。
- 從以下版本開始:
- 1.6
- 另請參見:
-
isretransformclassessupported()
,addtransformer(java.lang.instrument.classfiletransformer, boolean)
,classfiletransformer