Как перехватить метод с ByteBuddy как в CGLIB с MethodInterceptor для вызова MethodProxy.invokeSuper (...) - PullRequest
1 голос
/ 14 октября 2019

Я хочу перехватить некоторые методы с помощью ByteBuddy. Когда я использую InvocationHandlerAdapter.of(invocationHandler), я не могу вызвать супер метод. Экземпляр объекта удержания не подходит для моего случая. Я хочу точно так же, как в CGLIB, как показано ниже.

(MethodInterceptor)(obj, method, args, proxy)->{
   // to do some work
   Object o = proxy.invokeSuper(obj,args);
   // to do some work
   return o;
}

Как я могу добиться метода перехвата в ByteBuddy, как это?

Я пробовал MethodCall тип Implemetation, но это не решило моипроблема. Потому что я не могу управлять MethodCall.invokeSuper() в этом случае.

.intercept(MethodCall
                        .run(() -> System.out.println("Before"))
                        .andThen(MethodCall.invokeSuper())
                        .andThen(MethodCall
                                .run((() -> System.out.println("After")))))

1 Ответ

0 голосов
/ 15 октября 2019

Посмотрите на MethodDelegation, например:

public class MyDelegation {
  @RuntimeType
  public static Object intercept(@SuperCall Callable<?> superCall) throws Exception {
    // to do some work
    Object o = superCall.call();
    // to do some work
    return o;
  }
}

Затем с помощью:

.intercept(MethodDelegation.to(MyDelegation.class))

Вы можете проверить Javadoc для MethodDelegation, чтобы узнать больше аннотаций, которые вы можетеиспользовать для ввода контекстной информации.

...