【发布时间】:2018-05-07 09:43:47
【问题描述】:
我想尝试避免反射调用构造函数,并尝试遵循本文中采用的 LamdaMetaFactory 方法 - Faster alternatives to Java's reflection
我要构建的类如下所示:
interface DBBroker {}
public class NativeBroker implements DBBroker {
public NativeBroker(BrokerPool brokerPool, final Configuration configuration) {
}
}
使用LambaMetaFactory 我正在尝试构造一个BiFunction<BrokerPool, Configuration, DBBroker> 来替换对构造函数的直接调用。
到目前为止,我的代码如下所示:
Class<? extends DBBroker> clazz =
(Class<? extends DBBroker>) Class.forName("org.exist.storage.NativeBroker");
MethodHandles.Lookup lookup = MethodHandles.lookup();
MethodHandle mh =
lookup.findConstructor(clazz, MethodType.methodType(void.class, new Class[] {BrokerPool.class, Configuration.class}));
BiFunction<BrokerPool, Configuration, DBBroker> constructor
(BiFunction<BrokerPool, Configuration, DBBroker>)
LambdaMetafactory.metafactory(
lookup, "apply", MethodType.methodType(BiFunction.class),
mh.type(), mh, mh.type()).getTarget().invokeExact();
final DBBroker broker = constructor.apply(database, conf);
不幸的是,这会返回错误 -
AbstractMethodError: 方法 org/exist/storage/BrokerFactory$$Lambda$55.apply(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; 是抽象的。
我已经尝试修改传递给LambdaMetafactory.metafactory 的各种类型,但我似乎不能完全正确,而且Javadoc 肯定不容易理解。
有人可以建议吗?
【问题讨论】:
标签: java lambda java-8 invokedynamic