我有一个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();
添加回答
举报
0/150
提交
取消