首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用LambdaMetafactory调用默认构造函数

如何使用LambdaMetafactory调用默认构造函数
EN

Stack Overflow用户
提问于 2019-02-28 05:18:07
回答 1查看 331关注 0票数 1

在链接:How to instantiate an object using LambdaMetaFactory?中,提到了如何使用LambdaMetafactory实例化one-arg contrcutor。

我正在尝试对default-constructor执行同样的操作,但失败了,出现了以下错误:

代码语言:javascript
复制
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)

我正在尝试运行的代码:

代码语言:javascript
复制
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

代码语言:javascript
复制
import java.util.Collections;
import java.util.Map;

public class TestClass {

  public Map<String, String> getContextMap() {
    return Collections.emptyMap();
  }
}

为了使用LambdaMetafactory调用默认构造函数,我做错了什么?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-02-28 06:42:01

您的默认构造函数不带参数。将Function更改为Supplier

代码语言:javascript
复制
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;
}
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54914652

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档