如何在运行时实例化接口?
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.reflect.Proxy
) using 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...
我有一个只有默认方法的接口。
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.reflect.Proxy
) using 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...