- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我想尝试避免调用构造函数的反射,并尝试遵循本文中采用的 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/
我正在尝试使用 Java 的 LambdaMetaFactory动态实现通用 lambda,Handler : public class RoutingContext { // ... } @
当我调用 metafactory 时出现异常。它说: java.lang.invoke.LambdaConversionException: Incorrect number of param
尽管阅读了我所知道的所有文档,但我无法解决使用 lambda 执行方法的问题。为了提供一些背景知识,我的用例是一个插件系统。我正在使用可以分配给任何方法的注释 (@EventHandle)。我使用反射
我正在尝试显式使用 LambdaMetafactory.metafactory,我不明白为什么它只适用于 Runnable 功能接口(interface)。例如,此代码执行预期的操作(打印“hello
如何使用 LambdaMetaFactory 为 SAM/功能接口(interface)创建代理对象 即。相当于 public static Object java.lang.reflect.Prox
我正在尝试使用 LambdaMetafactory 来替换反射,但我遇到了一个问题。如果我使用特定的类,那么它会很好地工作,就像这样: MethodHandles.Lookup loo
基于 this stackoverflow answer ,我正在尝试使用反射实例化一个类,然后使用 LambdaMetafactory::metafactory 在其上调用单参数方法(我尝试使用反射
我有一个接口(interface) Action : package action; public interface Action { public String act(); } Simp
在我的工作中,我们有一个用于指定数学公式的 DSL,我们后来将其应用于很多点(以百万计)。 截至今天,我们构建了公式的 AST,并访问每个节点以生成我们所谓的“评估器”。然后,我们将公式的参数传递给评
我想尝试避免调用构造函数的反射,并尝试遵循本文中采用的 LamdaMetaFactory 方法 - Faster alternatives to Java's reflection 我要构建的类如下所
在转换 Java 8 access private member with lambda? 时来自 concrete format至 generic format我找到了 another limita
作为与 Holgers' solution 密切相关的后续问题,为什么取消注释覆盖会破坏下面的工作代码? public static interface StringFunction extends
我正在尝试使用 LambdaMetafactory.metafactory() 在 App.java 的 main 方法中执行带注释的方法: import com.drfits.annotation.
我正在尝试通过 LambdaMetafactory 动态创建 BiConsumer 类型的方法引用。我试图应用在 https://www.cuba-platform.com/blog/think-tw
我有这个工作正常的代码: Method getterMethod = Person.class.getDeclaredMethod("getName"); MethodHandles.Lookup l
我在调用通过调用 LambdaMetafactory#metafactory() 定义的方法时收到了 AbstractMethodError。我不知道我做错了什么导致它。我在网上查看了很多使用 Lam
我有一个简单的 Person 类,它有一个返回 String 的 getName(): public class Person { public String getName() {...}
我包括了AndroidRate library在我的项目中 android { ... compileOptions { sourceCompatibility Jav
我的问题与 Explicit use of LambdaMetafactory 密切相关在该线程中,提供了一些非常好的示例来使用 LambdaMetafactory 访问类的静态方法;但是,我想知道访
我在运行以下代码时遇到问题: public class LambdaTesting { public static void main(String[] args){
我是一名优秀的程序员,十分优秀!