2010-11-13 15 views
4

上下文: 在我的Java項目中,我是注入一個類(比如Injected.java)的字節碼,也是在Injected.java中注入對方法的引用的字節碼,以便此方法設置實例的值會員。這是驗證我是字節碼注入正確事物的一種方法。如何在類加載時調試注入虛擬機的字節碼?

問題: 在運行時,實例變量的值未按預期設置 - 這意味着我的字節碼注入顯然無法正常工作。

問題: 1)如何檢查運行時加載到JVM中的我的(新注入+修改的)類的內容? (javap可以幫助爲現有的類做這件事) 2)我可以通過Eclipse調試字節碼注入代碼嗎?有沒有插件

任何建議表示讚賞。

回答

1

您可以使用javaassist

讓我們走一步看一步:

  1. 獲取類文件的內容(比如,Point.class),您希望通過注入字節碼修改 BufferedInputStream fin = new BufferedInputStream(new FileInputStream("Point.class")); ClassFile cf = new ClassFile(new DataInputStream(fin));

  2. ClassFile提供了添加字段或方法的addField()和addMethod()(注意構造函數被視爲是字節碼級別的方法)。它還提供了用於向類文件添加屬性的addAttribute()。

    請注意,FieldInfo,MethodInfo和AttributeInfo對象包含指向ConstPool(常量池表)對象的鏈接。 ConstPool對象必須與添加到該ClassFile對象的ClassFile對象和FieldInfo(或MethodInfo等)對象相同。換句話說,FieldInfo(或MethodInfo等)對象不能在不同的ClassFile對象之間共享。

    要從ClassFile對象中刪除字段或方法,必須首先獲取包含該類的所有字段的java.util.List對象。 getFields()和getMethods()返回列表。通過在List對象上調用remove()可以刪除一個字段或方法。一個屬性可以用類似的方式刪除。在FieldInfo或MethodInfo中調用getAttributes()以獲取屬性列表,並從列表中刪除一個。

  3. 現在,檢查一下,如果注射果然奏效:

    MethodInfo minfo = cf.getMethod("move"); // we assume move is not overloaded.

    CodeAttribute ca = minfo.getCodeAttribute();

    有一些在的MethodInfo/CodeAttribute方法來檢查

如果你喜歡它,請讓我知道。這種情況下,我把一個更詳細的博客http://puspendu.wordpress.com/

編號:here

+0

這並沒有解決OP的使用情況,或回答任何一個他的問題。他想要檢查他在運行時注入的字節碼,而不是在執行前注入到類文件中的字節碼。(正如他所說的那樣,'javap'就是這麼做的。) – 2010-11-13 05:50:51

+0

順便說一句 - 對某人的答案進行倒退是不禮貌的。當你的答案更不重要時,以不相關的理由這樣做是非常跛腳的,IMO。 – 2010-11-13 05:54:18

+0

不幸的是,我已經學會了從堆棧溢出中進行倒票。看到這個http://stackoverflow.com/questions/3868878/java-check-if-command-line-arguments-are-null。順便說一句,如果你想投票贊成,編輯答案,我會投票贊成:) – 2010-11-13 09:35:07

相關問題