Имея динамический прокси для интерфейса с методами по умолчанию, как мне вызвать метод по умолчанию? Используя что-то вроде 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;
}
}