gpt4 book ai didi

java - 如何使用 LambdaMetaFactory 调用构造函数?

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:21:12 25 4
gpt4 key购买 nike

我想尝试避免调用构造函数的反射,并尝试遵循本文中采用的 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: Method org/exist/storage/BrokerFactory$$Lambda$55.apply(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; is abstract.

我尝试修改传递给 LambdaMetafactory.metafactory 的各种类型但我似乎不太明白这一点,而且 Javadoc 肯定不容易理解。

有人可以请教一下吗?

最佳答案

您犯的错误在于您使用的 SAM 类型。为此,必须使用 apply 方法的删除类型,所以这将是

methodType(Object.class, Object.class, Object.class)

但您也可以使用返回相同内容的 mh.type().generic():

BiFunction<BrokerPool, Configuration, DBBroker> constructor =
(BiFunction<BrokerPool, Configuration, DBBroker>)
LambdaMetafactory.metafactory(
lookup, "apply", methodType(BiFunction.class),
mh.type().generic(), mh, mh.type()).getTarget().invokeExact();
// ^^^^^^^^^^^^^^^^^^^

关于java - 如何使用 LambdaMetaFactory 调用构造函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50211216/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com