【发布时间】:2018-03-22 10:27:00
【问题描述】:
如何创建代理并调用默认接口方法,就好像它们是由代理超类实现的一样?例如:
interface Foo {
default int returnSomething() {
return 1;
}
}
interface Bar extends Foo {
default int returnSomethingMore() {
return returnSomething();
}
}
class Super implements Foo {
@Override
public int returnSomething() {
return 2;
}
}
我需要一个Bar 的代理,它在调用Bar::returnSomethingMore 时将使用Super::returnSomething 实现。
我试过了:
Enhancer enhancer = new Enhancer();
enhancer.setSuperclass(Super.class);
enhancer.setInterfaces(new Class[] { Bar.class });
enhancer.setCallback((obj, method, args, proxy) -> {
if (method.getName().equals("returnSomethingMore")) {
return proxy.invokeSuper(obj, args);
// -> NoSuchMethodError
return proxy.invoke(obj, args);
// -> StackOverflowError
Class<?> declaringClass = method.getDeclaringClass();
Lookup lookup = MethodHandles.lookup();
return MethodHandles
.privateLookupIn(declaringClass, lookup)
.unreflectSpecial(method, declaringClass)
.bindTo(obj)
.invokeWithArguments(args);
// -> returns 1, not 2
}
});
如何创建returnSomethingMore 方法返回2 的代理对象?
【问题讨论】:
-
基本上,我需要的是避免代理某些方法,即让代理实例自己调用默认实现。但我在
Enhancer上看到的唯一“过滤”是callbackFilter,它让您选择使用哪个 回调,而不是避免 使用一个。跨度> -
还尝试为该方法使用
NoOp回调过滤器,然后它仍然返回1而不是2(例如,它不使用returnSomething的Super实现)。
标签: java cglib dynamic-proxy