【问题标题】:Get class constructor by functional interface method signature通过功能接口方法签名获取类构造函数
【发布时间】:2021-01-21 13:12:39
【问题描述】:

我知道我可以像这样使用构造函数引用作为高阶方法的参数:

collection.stream().map(MyClass::new);

但我有MyClass 作为变量Class<MyClass> clazz = MyClass.class。 我可以使用它将构造函数引用传递给.map(Function) 方法吗? 我想做这样的事情,有办法吗?

Class<MyClass> clazz = MyClass.class;
collection.stream().map(clazz.getConstructor())

【问题讨论】:

  • 取决于你想多努力。最简单:clazz.getConstructor(Param.class)::newInstance - 但这要求功能接口可以抛出一些异常。
  • @JohannesKuhn 的重点是自动推断构造函数签名。
  • 嗯,不。做不到。
  • 当你有一个Class 实例时,它可能代表一个你不能实例化的抽象类或接口,它可能代表一个不允许创建更多实例或一个enum 类型类型没有匹配的构造函数或构造函数不可访问。这些都不能在编译时检查。另一方面,选择正确构造函数所需的推断通用签名在运行时不可用。

标签: java reflection functional-interface


【解决方案1】:

标准免责声明:使用反射几乎总是一个坏主意。

最好选择标准的抽象工厂或类似的。

但是,MethodHandle 将以最小的开销构造所需的 Function 对象(我认为)。如果您每次都查找fn,那会产生开销。

    Function<T, R> fn = (Function<T, R>)
        MethodHandleProxies.asInterfaceInstance(
            Function.class,
            MethodHandles.lookup().findConstructor(clazz,
               MethodType.methodType(Void.TYPE, tClass)
           )
        );

省略了异常处理。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-03-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多