2011-10-30 5 views
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(); 

그래서 난 쉽게 내가 실행하고 만 결국 내가 디스크에 저장해야 할 것이다하고자하는 모든 방문자를 스택 수 : 나는 형태의 무언가가 수 있다면 이상적 일 것입니다. 방문객 한 분이 방문하는 방법을 추가/제거/수정한다는 점을 명심하십시오!

답변

0

두 방문자 (ClassWriter 및 MethodRenamerVisitor)가 이미 스택에 있습니다. 기본적으로 체인의 다음 방문자는 첫 번째 매개 변수 i 생성자로 전달됩니다. 그래서 세 번째 것은 다음과 같이 추가 될 수 있습니다 :

ThirdVisitor v3 = new ThirdVisitor (methodRenamerVisitor); ForthVisitor v4 = 새 ForthVisitor (v3); 등

+0

그런 식으로 그들은 끔찍한 결합입니다. 예를 들어 실행 시간에 실행할 방문자를 선택할 수는 없습니다. –

+0

커플 링이 없습니다. 생성자는 ClassVisitor 인스턴스를 사용합니다. 당신이 정말로 런타임에 그들을 뒤섞고 싶다면, 당신은 공장의 콜렉션을 만들 수 있습니다, 각 공장은 "이전 방문객"의 인스턴스를 취할 것이고 그 공장을위한 특정 방문자의 인스턴스를 생성 할 것입니다. 아주 간단합니다. 내 경험에 비추어 볼 때 유스 케이스를 보지 못했다. –

+0

어색한. 하지만 다른 대안이없는 것 같습니다. –