gpt4 book ai didi

java - ASM 转换以查找具体的类类型

转载 作者:行者123 更新时间:2023-12-01 05:18:57 25 4
gpt4 key购买 nike

我正在开发一个项目,该项目将跟踪从包内的类到任何其他类的方法调用。能够识别具体类型非常重要,并且我希望跟踪开销最小。探针触发时间没有限制;它可以在调用方法之前或之后。

目前使用ASM,但没有要求。该系统正在从 AspectJ 迁移,以允许动态附加,所以这样就不行了。

以下是目前的情况。 “Tracer”枚举/单例接收probe(int)并处理调用。找到从具体类型到引用类型的调用就足够了。

@Override
void visitMethodInsn(final int opcode, final String owner, final String name, final String desc) {
Integer probeID = Tracer.INSTANCE.probes.createProbeIDAt(new Call(owner, name, desc))

super.visitFieldInsn(GETSTATIC, "org/flightofstairs/honours/capture/agent/Tracer", "INSTANCE", "Lorg/flightofstairs/honours/capture/agent/Tracer;");
super.visitLdcInsn(probeID)
super.visitMethodInsn(INVOKEVIRTUAL, "org/flightofstairs/honours/capture/agent/Tracer", "probe", "(Ljava/lang/Integer;)V")

super.visitMethodInsn(opcode, owner, name, desc);
}

我进一步的想法是以某种方式获取对被调用类的引用并调用 getClass() 来检索具体类型。如果堆栈包含 INVOKEINTERFACE 顶部的对象引用,但被调用方法的任何参数都放置在其上方,则这将是微不足道的。

考虑到参数的数量已知,计算对象引用的堆栈位置不会有问题,但 java 没有提供从堆栈较低位置复制引用的方法。

有什么建议吗?

干杯。

最佳答案

一个解决方案是在遍历过程中记录INVOKEINTERFACE。最后,ASM 分析器可用于查找将 objectref 插入堆栈的指令,然后可以轻松添加 getClass() 和跟踪代码。

此处显示了解决方案。 https://gist.github.com/2795738

关于java - ASM 转换以查找具体的类类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10744748/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com