¿Cómo invocar explícitamente el método predeterminado desde un Proxy dinámico?

Dado que las interfaces Java 8 podrían tener métodos predeterminados. Sé cómo invocar el método explícitamente desde el método de implementación, es decir (verExplícitamente llamando a un método predeterminado en Java)

Pero comoexplícitamente invocar el método predeterminado usando la reflexión, por ejemplo, en un proxy?

Ejemplo:

interface ExampleMixin {

  String getText();

  default void printInfo(){
    System.out.println(getText());
  }
}

class Example {

  public static void main(String... args) throws Exception {

    Object target = new Object();

    Map<String, BiFunction<Object, Object[], Object>> behavior = new HashMap<>();

    ExampleMixin dynamic =
            (ExampleMixin) Proxy.newProxyInstance(Thread.currentThread().getContextClassLoader(),new Class[]{ExampleMixin.class}, (Object proxy, Method method, Object[] arguments) -> {

                //custom mixin behavior
                if(behavior.containsKey(method.getName())) {
                    return behavior.get(method.getName()).apply(target, arguments);
                //default mixin behavior
                } else if (method.isDefault()) {
                    //this block throws java.lang.IllegalAccessException: no private access for invokespecial
                    return MethodHandles.lookup()
                                        .in(method.getDeclaringClass())
                                        .unreflectSpecial(method, method.getDeclaringClass())
                                        .bindTo(target)
                                        .invokeWithArguments();
                //no mixin behavior
                } else if (ExampleMixin.class == method.getDeclaringClass()) {
                    throw new UnsupportedOperationException(method.getName() + " is not supported");
                //base class behavior
                } else{
                    return method.invoke(target, arguments);
                }
            });

    //define behavior for abstract method getText()
    behavior.put("getText", (o, a) -> o.toString() + " myText");

    System.out.println(dynamic.getClass());
    System.out.println(dynamic.toString());
    System.out.println(dynamic.getText());

    //print info should by default implementation
    dynamic.printInfo();
  }
}

Editar: Sé que se ha hecho una pregunta similar en¿Cómo invoco los métodos predeterminados de Java 8 de forma refletiva?, pero esto no ha resuelto mi problema por dos razones:

El problema descrito en esa pregunta tenía como objetivo invocarlo a través de la reflexión.en general - por lo que no se hizo distinción entre el método predeterminado y el método anulado, y esto es simple, solo necesita una instancia.Una de las respuestas, el uso de identificadores de método, solo funciona con un truco desagradable (en mi humilde opinión), como cambiar los modificadores de acceso a los campos de la clase de búsqueda, que es la misma categoría de "soluciones" como esta:Cambiar el campo final estático privado usando la reflexión Java: es bueno saber que es posible, pero no lo usaría en producción - Estoy buscando una forma "oficial" de hacerlo.

losIllegalAccessException es arrojadounreflectSpecial

Caused by: java.lang.IllegalAccessException: no private access for invokespecial: interface example.ExampleMixin, from example.ExampleMixin/package
at java.lang.invoke.MemberName.makeAccessException(MemberName.java:852)
at java.lang.invoke.MethodHandles$Lookup.checkSpecialCaller(MethodHandles.java:1568)
at java.lang.invoke.MethodHandles$Lookup.unreflectSpecial(MethodHandles.java:1227)
at example.Example.lambda$main$0(Example.java:30)
at example.Example$Lambda$1/1342443276.invoke(Unknown Source)

Respuestas a la pregunta(4)

Su respuesta a la pregunta