Avendo un proxy dinamico per un'interfaccia con metodi predefiniti, come posso richiamare un metodo predefinito? Usando qualcosa come defaultmethod.invoke(this, ...)
hai appena chiamato il tuo gestore di chiamata proxy (che è in qualche modo corretto, perché non hai una classe di implementazione per questa interfaccia).Proxy dinamico Java8 e metodi predefiniti
Ho una soluzione alternativa che utilizza ASM per creare una classe che implementa l'interfaccia e che delega tali chiamate a un'istanza di questa classe. Ma questa non è una buona soluzione, soprattutto se il metodo predefinito chiama altri metodi di interfaccia (si ottiene un delegatore ping-pong). Il JLS è sorprendentemente in silenzio su questa domanda ...
Ecco un piccolo esempio di codice:
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;
}
}
Questo funziona. Avevo bisogno di un altro suggerimento, l'oggetto proxy mi deve conoscere nel gestore di chiamata. Grazie mille! – Cfx