2016-12-03 5 views
1

ByteBuddyAgent을 사용하여 런타임시 기본 메소드에 주석을 추가하려고합니다. 기본 구현을 유지하기 위해 리베이스 전략을 사용하고 있지만 원래 메소드를 호출하여 새 메소드를 인터셉트하는 방법을 알 수는 없습니다.ByteBuddy를 사용하여 인터페이스 기본 메소드를 리베이스하는 방법은 무엇입니까?

나는 MethodCall.invokeSuper()MethodCall.invokeSelf().onDefault()을 사용해 보았지만 두 가지 모두 나와 IllegalStateException을 사용했습니다.

new ByteBuddy() 
.subclass(MyInterface.class) 
.method(isDeclaredBy(typeDescription).and(isDefaultMethod())) 
    .intercept(MethodCall.invokeSelf().onDefault()) 
    .annotateMethod(AnnotationDescription.Builder 
     .ofType(MyAnnotation.class).build()) 
.make() 
... 

답변

1

SuperMethodCall.INSTANCE을 사용해야합니다. 이렇게하면 Byte Buddy는 리베이스 된 메소드 인 실제 수퍼 메소드를 찾을 수 있습니다.

동일한 경우에만 재귀 적으로 호출 할 수 있습니다. 또한 onDefault 구성은 MyInterface으로 구현 된 인터페이스에서 기본 메서드를 호출하려고 시도합니다.