为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

慕容森 2023-12-13 10:44:16
我有一个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)给定的提示。
查看完整描述

1 回答

?
qq_遁去的一_1

TA贡献1725条经验 获得超7个赞

您可以提供匹配器来MethodDelegation缩小要考虑的方法的范围:

MethodDelegation.withDefaultConfiguration().filter(...).to(...)

至于您的MethodCall,您需要指定要包含哪些参数,foo需要两个参数。由于您的原始参数似乎是等效的,因此您可以设置:

MethodCall.invoke(fooMethod).on(service).withAllArguments();


查看完整回答
反对 回复 2023-12-13
  • 1 回答
  • 0 关注
  • 116 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信