instrumentation.redefineClasses(def)
- 英文含義
翻譯過來就是
使用提供的類文件重新定義提供的一組類。
該方法用于替換類的定義撑教,而不引用現(xiàn)有的類文件字節(jié),就像從源進行重新編譯以進行修復(fù)和繼續(xù)調(diào)試時一樣。 在現(xiàn)有類文件字節(jié)要轉(zhuǎn)換的地方(例如擂仍,在字節(jié)碼檢測中)應(yīng)該使用retransformClasses。
一句話:在需要字節(jié)碼轉(zhuǎn)換的時候熬甚,直接從原路徑讀取類字節(jié)碼逢渔,不引用內(nèi)存中已經(jīng)加載的字節(jié)碼。該方法對一組類文件進行操作乡括,以便同時允許多個類的相互依賴的更改(A類的重新定義可能需要重新定義B類)肃廓。
如果重新定義的方法具有活動堆棧幀,則這些活動幀將繼續(xù)運行原始方法的字節(jié)碼诲泌。 重新定義的方法將用于新的調(diào)用盲赊。
也就是說,既往不咎的意思呀7笊ā0ⅰ!該方法不會導(dǎo)致任何初始化葵第,除了在常規(guī)JVM語義下會發(fā)生绘迁。 換句話說,重新定義一個類并不會導(dǎo)致它的初始化器被運行卒密。 靜態(tài)變量的值將保持在調(diào)用之前缀台。
重新定義的類的實例不受影響。
重定義可能會更改方法體哮奇、常量池和屬性膛腐。重定義不得添加、移除屏镊、重命名字段或方法依疼;不得更改方法簽名痰腮、繼承關(guān)系而芥。在以后的版本中,可能會取消這些限制膀值。在應(yīng)用轉(zhuǎn)換之前棍丐,類文件字節(jié)不會被檢查误辑、驗證和安裝。如果結(jié)果字節(jié)錯誤歌逢,此方法將拋出異常巾钉。
如果此方法拋出異常,則不會重定義任何類秘案。
此方法旨在用于檢測砰苍,正如類規(guī)范所述。
參數(shù):
definitions - 要使用相應(yīng)定義來進行重定義的類數(shù)組阱高;允許長度為 0 數(shù)組赚导,在這種情況下,此方法不執(zhí)行任何操作
拋出:
- UnmodifiableClassException - 如果無法修改指定的類(isModifiableClass(java.lang.Class) 返回 false)
- UnsupportedOperationException - 如果 JVM 的當前配置不允許重定義(isRedefineClassesSupported() 為 false)或重定義試圖做出不受支持的更改
- ClassFormatError - 如果數(shù)據(jù)不包含有效類
- NoClassDefFoundError - 如果類文件中的名稱與類名稱不相等
- UnsupportedClassVersionError - 如果類文件版本號不受支持
- ClassCircularityError - 如果新類包含循環(huán)
- LinkageError - 如果發(fā)生鏈接錯誤
- NullPointerException - 如果提供的定義數(shù)組或其任何組件為 null赤惊。
- ClassNotFoundException - 不會拋出(存在只是為了兼容)