ASM转换找到具体的类类型

时间:2012-05-24 20:23:12

标签: java interface bytecode java-bytecode-asm

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

目前使用ASM,但没有要求。系统正在从AspectJ移动,以便允许动态附件,这样就可以了。

以下是目前的情况。 'Tracer'enum / singleton接收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顶部的对象ref,但是调用方法的任何参数都放在它上面,这将是微不足道的。

计算对象引用的堆栈位置不会有问题,因为参数的数量是已知的,但java无法从堆栈中的较低位置复制引用。

有什么建议吗?

干杯。

1 个答案:

答案 0 :(得分:0)

解决方案是在遍历期间记录INVOKEINTERFACE。最后,ASMs Analyzer可用于查找将objectref推入堆栈的指令,从那里添加getClass()和跟踪代码很简单。

这里显示了一个解决方案。 https://gist.github.com/2795738