Как явно вызвать метод по умолчанию из динамического прокси?

Поскольку интерфейсы Java 8 могут иметь методы по умолчанию. Я знаю, как явно вызывать метод из метода реализации, т. Е. (См.Явный вызов метода по умолчанию в Java)

Но как мнеэксплицитно вызвать метод по умолчанию, используя отражение, например, на прокси?

Пример:

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();
  }
}

Редактировать: Я знаю, что подобный вопрос был задан вКак вызвать методы по умолчанию Java 8 рефлексивно, но это не решило мою проблему по двум причинам:

проблема, описанная в этом вопросе, направлена ​​на то, чтобы вызвать ее через рефлексиюв общем - поэтому не было проведено никакого различия между методом по умолчанию и переопределенным методом - и это просто, вам нужен только экземпляр.один из ответов - использование дескрипторов методов - работает только с неприятным хаком (imho), таким как изменение модификаторов доступа к полям класса поиска, который относится к той же категории «решений», как этот:Изменить частное статическое конечное поле с помощью отражения Java: приятно знать, что это возможно, но я бы не стал использовать его в производстве - Я ищу "официальный" способ сделать это.

IllegalAccessException брошен вunreflectSpecial

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)

Ответы на вопрос(4)

Ваш ответ на вопрос