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