【发布时间】:2014-10-05 19:56:22
【问题描述】:
拥有一个带有默认方法的接口的动态代理,我如何调用默认方法?通过使用 defaultmethod.invoke(this, ...) 之类的东西,您只需调用您的代理调用处理程序(这在某种程度上是正确的,因为您没有此接口的实现类)。
我有一个解决方法,使用 ASM 创建一个实现接口的类并将此类调用委托给该类的一个实例。但这不是一个好的解决方案,特别是如果默认方法调用其他接口方法(你得到一个委托人乒乓球)。 JLS 出人意料地对这个问题保持沉默……
这里有一个小代码示例:
public class Java8Proxy implements InvocationHandler {
public interface WithDefaultMethod {
void someMethod();
default void someDefaultMethod() {
System.out.println("default method invoked!");
}
}
@Test
public void invokeTest() {
WithDefaultMethod proxy = (WithDefaultMethod) Proxy.newProxyInstance(
WithDefaultMethod.class.getClassLoader(),
new Class<?>[] { WithDefaultMethod.class }, this);
proxy.someDefaultMethod();
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
// assuming not knowing the interface before runtime (I wouldn't use a
// proxy, would I?)
// what to do here to get the line printed out?
// This is just a loop
// method.invoke(this, args);
return null;
}
}
【问题讨论】: