我有一个对象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)
。
答案 0 :(得分:1)
您可以为firebase.auth().createUserWithEmailAndPassword(email, password).then(cred=>{
cred.user.updateProfile({
displayName: first_name + " " + last_name
})
})
.catch(function(error) {
// Handle Errors here.
var errorCode = error.code;
var errorMessage = error.message;
window.alert("Error: " + errorMessage);
// ...
});
提供一个匹配器,以缩小要考虑的方法:
MethodDelegation
对于MethodDelegation.withDefaultConfiguration().filter(...).to(...)
,您需要指定要包含的参数,MethodCall
接受两个参数。由于您的原始参数似乎是等效的,因此可以设置:
foo