2012-01-12 19 views
3

我有一個字節數組,代表一個類文件的字節。確定類的超類而類是以字節數組的形式?

我想獲得由字節數組表示的類的超類。目前,我使用ClassLoader類的「defineClass」方法的反射來創建由字節數組表示的類的類定義。然後通過在新創建的Class對象上調用getSuperclass()來獲得超類。

基於由字節數組表示的類的超類,我需要執行字節碼轉換。然後最終目標是在轉換後重新定義由字節數組表示的類。

問題是我無法將轉換後的類重新定義爲其原始名稱,因爲兩個具有相同名稱的類無法在同一個JVM實例中定義。

我真的需要能夠根據字節數組所表示的類的超類進行轉換,並且確實需要使用其原始名稱重新定義轉換後的類。

有沒有什麼辦法來獲得類的超類,而類是以字節數組的形式?基於.class文件的格式,我會假設我可以以某種方式「確定」超類,而不將類定義爲類對象並將其加載到JVM中,但我不確定從哪裏開始這樣做。

有什麼建議嗎?

+0

不知道這是否真的有效,但:使用不同的命名空間? – 2012-01-12 00:40:52

+0

只需解析字節碼。 – 2012-01-12 01:01:58

回答

3

簡單,但在運行時效率不高:在新的類加載器中定義類,確定超類型,進行轉換,並在您選擇的類加載器中定義類。 (不同類加載器加載的類在運行時被認爲是不同的)。

效率更高:使用一些能夠檢查類文件的庫,如JavassistTutorial),或自己編寫解壓縮代碼(檢查class file specification)。

+0

我正在考慮在發佈後期內容(我自己從類文件中讀取某些字節以查找超類)之前,意識到我可以通過我已經使用的庫ASM來實現此目的。我選擇你的回答作爲答案,因爲它提供了多種解決方案來解決我的問題,儘管它不提供我選擇的解決方案。感謝您的迴應! – mburke13 2012-01-12 20:25:16

1

我已經使用Objectweb's ASM這不是最簡單的API之一,但可能是最快的。

+1

我正在使用ASM來轉換類字節。現在你提到它,我意識到我可以使用一個簡單的ClassVisitor來讀取關於該類的信息,而不必將其定義爲一個類。感謝您指出了這一點! – mburke13 2012-01-12 20:22:43

相關問題