【问题标题】:How can I instantiate an interface at runtime?如何在运行时实例化接口?
【发布时间】:2020-03-09 10:07:52
【问题描述】:

我有一个只有默认方法的接口。

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

【问题讨论】:

  • 似乎是解决某事的一种不同寻常的方法,您能否提供有关您为何尝试实现此目的的信息?
  • 当您已经获得new Some() {} 的接口实例时,代理的意义何在?

标签: java interface instantiation


【解决方案1】:

可以使用 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...

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-03-21
  • 2016-10-04
  • 2011-12-31
  • 1970-01-01
  • 1970-01-01
  • 2012-07-22
  • 1970-01-01
相关资源
最近更新 更多