使用 ByteBuddy 定义方法、调用和拦截器并委托给目标?

我有一个service具有多种方法的对象,其中一种方法是foo(arg1, arg2).

想要创建一个新的包装类:

  • _foo具有带有一个附加参数的单一方法

  • 将执行委托_foo给拦截器,返回被忽略

  • 最后,将调用委托给foo目标service.

不知何故,我没有这样做:

final List<Class<?>> parameters =

    Arrays.stream(fooMethod.getParameters())

          .map(Parameter::getType)

          .collect(Collectors.toList());


    parameters.add(AdditionalParameter.class);



final DynamicType.Unloaded unloadedType = new ByteBuddy()

    .subclass(Object.class)

    .implement(interfaceType)

    .name(service.getClass().getSimpleName() + "Dynamic")

    .defineMethod(

        "_" + methodName,

        resolveReturnType(fooMethod),

        Modifier.PUBLIC)

    .withParameters(parameters)

    .intercept(to(fooInterceptor).andThen(

        MethodCall.invoke(fooMethod).on(service)

    ))

    .make();

fooInterceptor是一个InvocatiomHandler实例:


public class FooInterceptor implements InvocationHandler {

public Object invoke(

    @This final Object proxy,

    @Origin final Method method.

    @AllArguments final Object[] args) {

    ...

    }

}

例外情况是我的fooService“不接受 0 个参数”。

我可以service.foo()从拦截器调用 - 但不使用反射吗?我无法这样做(但还没有玩过那个部分)。

帮忙吗?🙏

编辑:我无法控制哪些方法,service所以我不能简单地使用to(service)拦截调用;可能存在 ByteBuddy 无法找到匹配方法的情况。

EDIT2:如果我可以“告诉”ByteBuddy 要绑定的目标方法的名称,那就太棒了。然后我可以使用to(service)给定的提示。


慕容森
浏览 59回答 1
1回答

qq_遁去的一_1

您可以提供匹配器来MethodDelegation缩小要考虑的方法的范围:MethodDelegation.withDefaultConfiguration().filter(...).to(...)至于您的MethodCall,您需要指定要包含哪些参数,foo需要两个参数。由于您的原始参数似乎是等效的,因此您可以设置:MethodCall.invoke(fooMethod).on(service).withAllArguments();
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java