我工作的一个项目,将跟踪的方法调用从一个类在一个包中的任何其他类别。 我能确定具体的类型,并且我也希望有一个最小的跟踪开销是很重要的。 有当探头触发没有限制; 它可以是一个方法被调用之前或之后。
ASM正在使用,但它没有要求。 该系统是从AspectJ的移动,以便允许动态附着,所以这是出来。
以下是目前的情况。 A“示踪”枚举/单接收探头(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提供没有办法从堆栈中的下复制一个参考。
有什么建议?
干杯。