2017-11-03 2 views
0

Javassist proxyFactory는 메소드 인터셉터를 사용하여 런타임에 프록시를 작성할 수 있습니다. 하지만 class 파일을 수정하여 클래스에 메소드 인터셉터를 정적으로 추가하는 방법은 무엇입니까?바이트 코드 도구 : 클래스에 메소드 인터셉터 추가 (프록시가 아님)

예를 들어, 클래스 Foo에는 100 개의 메소드가 있으며, Foo 인스턴스에서 메소드를 호출하기 전에 Foo 인스턴스가 초기화되었는지 확인해야합니다.

public class Foo { 

    public void methodA() { 
     ... 
    } 

    public void methodB() { 
     ... 
    } 

    public void methodC() { 
     ... 
    } 

    .... 
} 

이러한 메소드 인터셉터를 추가하기 위해 클래스 파일을 수정하는 방법은 무엇입니까? 한 가지 방법은 각 메소드의 시작 부분에 코드를 추가하는 것입니다. 더 좋은 방법이 있습니까?

cglib와 같은 다른 바이트 코드 도구는 어떻습니까?

답변

0

이 실현하려 ByteBuddy 두 가지 옵션이 있습니다 :

  • 사용 재정의가/기능을 리베이스 - 당신은 '형식 재정의'/ '를 입력 리베이스' 태그 아래 ByteBuddy tutorial에 대한 세부 정보를 확인하실 수 있습니다가. 여기서 제한은 대상 클래스가로드되기 전에 이러한 종류의 변환을 수행해야한다는 것입니다.
  • Java Agent - 클래스 이전에 실행되는 에이전트가로드되어 기존 클래스를 수정할 수 있도록합니다. ByteBuddy는 훌륭한 AgentBuilder (tutorial - 'Java 에이전트 생성')와 함께 제공됩니다. 런타임시 특별한 ByteBuddy 에이전트를 설치하는 것도 가능합니다 (언급 된 튜토리얼의 예제).

    class Foo { 
        String m() { return "foo"; } 
    } 
    
    class Bar { 
        String m() { return "bar"; } 
    } 
    
    ByteBuddyAgent.install(); 
    Foo foo = new Foo(); 
    new ByteBuddy() 
        .redefine(Bar.class) 
        .name(Foo.class.getName()) 
        .make() 
        .load(Foo.class.getClassLoader(), ClassReloadingStrategy.fromInstalledAgent()); 
    assertThat(foo.m(), is("bar")); 
    
관련 문제