Как я могу создать интерфейс во время выполнения? - PullRequest
0 голосов
/ 09 марта 2020

У меня есть интерфейс только с методами по умолчанию.

interface Some {
    default void doSome() {
    }
}

И я создаю какой-то экземпляр прокси-сервера из него.

(Some) getProxy(new Class<?>[]{Some.class}, new Some() {});

Теперь мне нужен какой-то служебный метод сделать это для любого интерфейса.

Есть ли какой-нибудь хороший способ сделать это?

<T> T static proxy(final Class<T> clazz) {
    // @@? How can I do `new T(){}` from the class?
}

1 Ответ

1 голос
/ 09 марта 2020

Можно вызвать метод интерфейса по умолчанию из динамического прокси c (java.lang.reflect.Proxy), используя java.lang.invoke.MethodHandles.

public interface Some {

  default void doSome() {
    System.out.println("something...");
  }

  @SuppressWarnings("unchecked")
  static <T> T getProxy(Class<T> clazz) {
    return (T) Proxy.newProxyInstance(
        clazz.getClassLoader(),
        new Class[]{clazz},
        (proxy, method, args) -> MethodHandles.lookup()
            .in(clazz)
            .unreflectSpecial(method, clazz)
            .bindTo(proxy)
            .invokeWithArguments());
  }

  public static void main(String[] args) {
    Some some = getProxy(Some.class);
    some.doSome();
  }
}

Метод main печатает:

something...
...