2017-03-14 4 views
0

기존 프레임 워크에 이미 정의 된 Source 클래스를 다시 정의하려고합니다. 원본 클래스의 원본 인스턴스를 내 향상된 클래스로 자동으로 대체하려고합니다. 소스 객체를 만드는 코드에 액세스 할 수 없으므로 클래스 대체가 자동으로 수행되어야합니다. byte-buddy를 사용하여이 작업을 수행 할 수 있습니까?바이트 - 버디를 사용하여 클래스 다시 정의

ByteBuddyAgent.install(); 
    Source source = new ByteBuddy() 
      .subclass(Source.class) 
      .method(named("hello")).intercept(MethodDelegation.to(Target.class)) 
      .defineMethod("myNewMethod", void.class).intercept(MethodDelegation.to(Target.class)) 
      .make() 
      .load(Source.class.getClassLoader(), 
        ClassReloadingStrategy.fromInstalledAgent()) 
      .getLoaded() 
      .newInstance(); 

답변

0

Byte Buddy를 사용하여 클래스를 재정의 할 수 있습니다. 이렇게하려면 서브 클래 싱하는 대신 ByteBuddy::redefine 또는 ByteBuddy::rebase 메서드를 사용합니다. 이러한 기능을 사용하는 가장 표준적인 방법은 AgentBuilder을 사용할 수있는 Java 에이전트를 정의하는 것입니다.

+0

확인. 감사 ! 새로운 메소드를 추가하는 것은 서브 클래스화할 때만 허용되어야하지만 그렇지 않으면 스레드 "main"에서 ** 예외가 발생합니다 java.lang.UnsupportedOperationException : 클래스 재정의가 실패했습니다 : 스키마 변경 시도 (필드 추가/제거) ** –

+0

내가하려고하는 것은 실제로 이것은 : 주어진 인터페이스를 구현하는 객체의 인스턴스가 있습니다. 현재 구현은 동일한 인터페이스의 새 객체를 만들고 대부분의 호출을 원래 객체에 위임합니다. 또한 메소드의 일부를 변경하고 몇 가지 메소드를 추가합니다. 원하는 것은 계측을 사용하여 원래 인터페이스가 변경 될 때마다 항상 새 메소드를 내 장식 오브젝트에 추가하지 않아야한다는 것입니다. 가장 좋은 방법은 하위 클래스를 사용하고 ** 메서드 (isDeclaredBy (Source.class)) **를 사용하여 인터페이스의 모든 메서드를 위임하는 것입니다. ** –

+0

Java 에이전트를 사용하여 클래스를 바꿀 수는 없으며 메서드 내에서 사용자 지정 디스 패칭 논리. 'Advice' 컴포넌트를 살펴 보길 권한다. –