[英]Monitor Object Creation using ASM in Java
我正在使用ASM來監視Java中的對象創建。 目前,我將調用init作為創建新對象的指示器並從中調整程序
invoke XXX.init
至
dup;
invoke XXX.init;
call_my_method(Object)
我的想法是復制newObjectReference的副本,並且在此對象的init之后,我調用我的方法來保留此對象。
但是,在運行時期間,有一個例外:
java.lang.VerifyError, Expecting to find unitialized object on stack.
當我使用“-noverify”選項時,在運行時,如果有一個線程實例,則拋出第二個異常:
Exception in thread "main" java.lang.IllegalThreadStateException
at java.lang.Thread.start(Unknown Source)
at test.ThreadTest.test
對於第二種情況,我確信除了原始程序之外,沒有調用線程的start ()。
有沒有更好的方法來監控新對象的創建?
非常感謝。
嘗試,將調用XXX.init轉換為
invoke XXX.init;
dup;
call_my_method(Object)
在init方法返回后,基本上調用副本。
說明::所以假設您想要跟蹤新的對象創建,我猜您正在查看諸如新XXX()之類的語句。 現在,這轉換為字節碼的方式如下: -
NEW XXX
DUP
INVOKESPECIAL <init>
換句話說, NEW字節碼指令用於創建對象本身。 它在堆棧頂部重復,因此您有一個對象的附加副本。 此時請注意,對象的2個副本未初始化。 然后在堆棧頂部的第一個未初始化對象上調用init方法。 到構造函數返回時,對象被初始化,因此位於堆棧頂部的對象也被初始化。 (這是因為位於堆棧頂部的“對象”實際上是一個對象引用,指向位於堆上某處的實際對象。我使用單詞object而不是對象引用,因為它更容易解釋事物。對不起,如果這引起任何混淆。)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.