簡體   English   中英

如何在運行時實例化接口?

[英]How can I instantiate an interface at runtime?

我有一個只有默認方法的接口。

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?
}

可以使用java.lang.invoke.MethodHandles從動態代理 ( java.lang.reflect.Proxy ) 調用默認接口方法。

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...

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM