[英]How to invoke default constructor using LambdaMetafactory
In the link: How to instantiate an object using LambdaMetaFactory? 在链接中: 如何使用LambdaMetaFactory实例化对象? it is mentioned how to instantiate a one-arg contrcutor using LambdaMetafactory. 提到了如何使用LambdaMetafactory实例化一个单参数构造器。
I am trying to do the same for default-constructor but is failing with the below error: 我正在尝试对default-constructor进行相同的操作,但由于以下错误而失败:
Exception in thread "main" java.lang.AbstractMethodError: Method com/test/Main$$Lambda$1.apply(Ljava/lang/Object;)Ljava/lang/Object; is abstract
at com.test.Main$$Lambda$1/186370029.apply(Unknown Source)
at com.test.Main.test2(Main.java:29)
at com.test.Main.main(Main.java:14)
Code I am trying to run: 我正在尝试运行的代码:
import java.lang.invoke.LambdaMetafactory;
import java.lang.invoke.MethodHandle;
import java.lang.invoke.MethodHandles;
import java.lang.invoke.MethodType;
import java.util.function.Function;
public class Main {
public static void main(String[] args) throws Throwable {
long t2= System.nanoTime();
for(int i=0;i<10000;i++){
test2(TestClass.class.getName());
}
long t3= System.nanoTime();
System.out.println((t3-t2)*1e-9);
}
private static TestClass test2(String objclass)
throws Throwable {
Class clazz = Class.forName(objclass);
MethodHandles.Lookup lookup = MethodHandles.lookup();
MethodHandle mh = lookup.findConstructor(clazz, MethodType.methodType(void.class));
Function<String, TestClass> constructor = (Function<String, TestClass>) LambdaMetafactory
.metafactory(lookup, "apply",MethodType.methodType(Function.class),
mh.type().generic(), mh, mh.type()).getTarget().invokeExact();
TestClass testClass = constructor.apply(objclass);
return testClass;
}
}
TestClass 识别TestClass
import java.util.Collections;
import java.util.Map;
public class TestClass {
public Map<String, String> getContextMap() {
return Collections.emptyMap();
}
}
What am I doing wrong in order to invoke the default constructor using LambdaMetafactory? 为了使用LambdaMetafactory调用默认构造函数,我在做什么错?
Your default constructor takes no parameter. 您的默认构造函数不带参数。 Change Function
to Supplier
: 将Function
更改为Supplier
:
private static TestClass test2(String objclass)
throws Throwable {
Class clazz = Class.forName(objclass);
MethodHandles.Lookup lookup = MethodHandles.lookup();
MethodHandle mh = lookup.findConstructor(clazz, MethodType.methodType(void.class));
Supplier<TestClass> constructor = (Supplier<TestClass>) LambdaMetafactory.metafactory(
lookup, "get", MethodType.methodType(Supplier.class), mh.type().generic(), mh, mh.type()
).getTarget().invokeExact();
TestClass testClass = constructor.get();
return testClass;
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.