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