爲具有默認方法的接口提供動態代理,如何調用默認方法?通過使用諸如defaultmethod.invoke(this, ...)
之類的東西,你只需要調用你的代理調用處理程序(這是正確的,因爲你沒有這個接口的實現類)。Java8動態代理和默認方法
我有一個解決方法,使用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;
}
}
這可以工作。我還需要一個提示,代理對象必須在調用處理程序中知道。非常感謝你! – Cfx 2014-10-06 07:59:47