簡體   English   中英

使用Java中的ASM監視對象創建

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM