Posiadanie dynamicznego serwera proxy dla interfejsu z domyślnymi metodami, w jaki sposób wywołać metodę domyślną? Używając czegoś takiego jak defaultmethod.invoke(this, ...)
po prostu otrzymujesz wywołanie procedury wywołania serwera proxy (co jest jakoś poprawne, ponieważ nie masz klasy implementującej dla tego interfejsu).Java8 dynamiczne proxy i domyślne metody
Mam obejście używające ASM do utworzenia klasy implementującej interfejs i delegowania takich wywołań do instancji tej klasy. Ale to nie jest dobre rozwiązanie, zwłaszcza jeśli domyślna metoda wywoła inne metody interfejsu (otrzymasz ping-ponga). JLS jest zaskakująco cichy o tym mowa ...
Oto mały przykład kodu:
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;
}
}
To działa. Potrzebowałem jeszcze jednej podpowiedzi, obiekt proxy musi mnie znać w module obsługi wywołań. Dziękuję Ci bardzo! – Cfx