사용 사례를내가 자바 SE8 <code>ClassFileTransformer</code> 구현을 작성하려고 해요
을 실행하지 ClassTransformer를. 이것의 목표는 디버깅입니다. 나는 BTrace에 대해 잘 알고 있지만, 실제로하려고하는 것에 대한 청구서에 맞지 않습니다. 즉, 내부 메서드 수준 검사입니다. BTrace는 중단 점을 입력/종료로 제한합니다. 나는 이것에 대해 자세히 알고 싶었다.
그래서 지금은 ASM으로이 작업을 직접 수행 할 수 있다고 생각했습니다.
그래서 나는 간단한 ClassFileTransformer
를 정의하여 시작
문제 (ASM는 ByteBuddy 및 BTrace 사용하는 바이트 코드 조작 라이브러리입니다).
public class PreMainInjection {
public static void premain(String agentArgs,
Instrumentation inst) {
inst.addTransformer(new EntryPoint(), true);
}
}
public class EntryPoint implements ClassFileTransformer {
public EntryPoint() { }
@Override
public byte[] transform(ClassLoader classloader, String name,
Class<?> clazz, ProtectionDomain prot, byte[] data) {
System.out.printf("Loaded: %s\n", name);
}
}
그리고 완벽하게 작동했습니다. D 모든 클래스의 목록이 내가 조사 할 응용 프로그램으로 표시됩니다.
이제 ASM을 가져옵니다.
public class PreMainInjection {
public static void premain(String agentArgs,
Instrumentation inst) {
inst.addTransformer(new EntryPoint(), true);
}
}
public class EntryPoint implements ClassFileTransformer {
public EntryPoint() { }
@Override
public byte[] transform(ClassLoader classloader, String name,
Class<?> clazz, ProtectionDomain prot, byte[] data) {
ClassReader reader = new ClassReader(bytes);
ClassNode node = new ClassNode();
ClassWriter writer = new ClassWriter(
ClassWriter.COMPUTE_FRAMES|ClassWriter.COMPUTE_MAXS);
reader.accept(node, ClassReader.EXPAND_FRAMES);
System.out.printf("Name: %s", node.name);
node.accept(writer);
return writer.toByteArray();
}
}
이것은 작동합니다 ... 지금까지 내 앱이 중단되지 않습니다. 하지만 단일 디버그 출력을 보지 못했습니다.
그럼 어떻게 될까요? 내 에이전트가 그냥 응용 프로그램은 여전히 작동
System.out.printf("Loaded %s\n", name);
return null;
않는 경우
더 확장하려면 내가 출력을 볼 수 있습니다. 그래서 나는 매우 혼란 스럽다.
'ASM'이란 무엇입니까? –
@MarkStewart https://en.wikipedia.org/wiki/ObjectWeb_ASM? –
ASM : http://asm.ow2.org/ 자바 바이트 코드 조작 라이브러리. OP를 업데이트하여이를 반영하고 더 나은 참조를 제공하십시오. –