Java探針技術-retransformclasses的介紹


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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM