Я хочу попытаться избежать рефлексии для вызова конструктора, и я пытаюсь следовать подходу LamdaMetaFactory, принятому в этом посте - Более быстрые альтернативы рефлексии Java
Мой класс, который я хочу построить, выглядит так:
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: Метод
орг / существует / хранение / BrokerFactory $$ Лямбда $ 55.apply (Ljava / языки / объект; Ljava / языки / объект;) Ljava / языки / объект;
абстрактно.
Я попытался изменить различные типы, переданные в LambdaMetafactory.metafactory
, но я не могу понять, как это правильно, и Javadoc, конечно, не так легко понять.
Может кто-нибудь посоветовать, пожалуйста?