저는 패키지 내의 클래스에서 다른 클래스로 메소드 호출을 추적하는 프로젝트에서 작업 중입니다. 구체적인 유형을 식별 할 수 있어야하며 최소한의 추적 오버 헤드를 선호하는 것이 중요합니다. 프로브가 트리거되는 시간에는 제한이 없습니다. 메서드가 호출되기 전이나 후에 호출 될 수 있습니다.구체적인 클래스 유형을 찾기위한 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에 대해 객체 참조가 포함되어 있지만 호출 된 메소드에 대한 매개 변수가 그 위에 배치되면 사소한 문제입니다.
매개 변수 수가 알려져 있기 때문에 개체 참조의 스택 위치를 계산하는 데 문제가되지 않지만 Java에서는 스택의 아래쪽에서 참조를 복제 할 방법이 없습니다.
어떤 조언이 필요합니까?
건배.