加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

使用Java中的ASM监视对象创建

发布时间:2020-12-14 19:22:12 所属栏目:Java 来源:网络整理
导读:我正在使用ASM来监视Java中的对象创建.目前,我将调用init作为创建新对象的指示器并从中调整程序 invoke XXX.init 至 dup; invoke XXX.init; call_my_method(Object) 我的想法是复制newObjectReference的副本,并且在此对象的init之后,我调用我的方法来保留此

我正在使用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转换为

调用XXX.init;
DUP;
call_my_method(对象)

在init方法返回后,基本上调用副本.

说明::所以假设您想要跟踪新的对象创建,我猜您正在查看诸如新XXX()之类的语句.现在,这转换为字节码的方式如下: –

新XXX
DUP
INVOKESPECIAL< init>

换句话说,NEW字节码指令用于创建对象本身.它在堆栈顶部重复,因此您有一个对象的附加副本.此时请注意,对象的2个副本未初始化.然后在堆栈顶部的第一个未初始化对象上调用init方法.到构造函数返回时,对象被初始化,因此位于堆栈顶部的对象也被初始化. (这是因为位于堆栈顶部的“对象”实际上是一个对象引用,指向位于堆上某处的实际对象.我使用单词object而不是对象引用,因为它更容易解释事物.对不起,如果这引起任何混淆.)

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读