1
현재 클래스의 각 메소드에 대해 .class 파일에서 방문자를 실행하여 바이트 코드를 계측해야하는 몇 가지 코드를 구현 중입니다. 순간, 난 그냥 MethodRenamerVisitor을 구현했습니다, 그러나 이것은 이미 상당히 어색 해지고있다 :몇 가지 ASM-Bytecode 방문자를 쉽게 쌓을 수있는 방법은 무엇입니까?
ClassReader classReader = null;
try {
classReader = new ClassReader(monitoringFile.getCannonicalName());
} catch (IOException e1) {
e1.printStackTrace();
}
ClassWriter classWriter = null;
for (BytecodeMethod bytecodeMethod : bytecodeClass.bytecodeMethods) {
System.out.println("\t" + bytecodeMethod.getName());
classWriter = new ClassWriter(ClassWriter.COMPUTE_FRAMES);
MethodRenamerVisitor methodRenamerVisitor = new MethodRenamerVisitor(classWriter, bytecodeMethod);
classReader.accept(methodRenamerVisitor, 0);
String outputFile = monitoringFile.getCannonicalName();
outputFile = outputFile.replace('.', File.separatorChar)+".class";
classReader = new ClassReader(classWriter.toByteArray());
}
try {
fileSystem.writeToDisk(
classFilename,
classWriter.toByteArray()
);
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
나는 BytecodeMethods 각각에 다른 방문자에게 적용하고자하는 과정에서 지금입니다. 이걸 지나치게 복잡하게 만들었나요?
MultiVisitors multiVisitors = new MultiVisitors();
visitors.add(new AVisitor(...));
visitors.add(new BVisitor(...));
...
visitors.run();
그래서 난 쉽게 내가 실행하고 만 결국 내가 디스크에 저장해야 할 것이다하고자하는 모든 방문자를 스택 수 : 나는 형태의 무언가가 수 있다면 이상적 일 것입니다. 방문객 한 분이 방문하는 방법을 추가/제거/수정한다는 점을 명심하십시오!
그런 식으로 그들은 끔찍한 결합입니다. 예를 들어 실행 시간에 실행할 방문자를 선택할 수는 없습니다. –
커플 링이 없습니다. 생성자는 ClassVisitor 인스턴스를 사용합니다. 당신이 정말로 런타임에 그들을 뒤섞고 싶다면, 당신은 공장의 콜렉션을 만들 수 있습니다, 각 공장은 "이전 방문객"의 인스턴스를 취할 것이고 그 공장을위한 특정 방문자의 인스턴스를 생성 할 것입니다. 아주 간단합니다. 내 경험에 비추어 볼 때 유스 케이스를 보지 못했다. –
어색한. 하지만 다른 대안이없는 것 같습니다. –