Java 如何获取构造函数lambda的返回类型

Java 如何获取构造函数lambda的返回类型,java,reflection,lambda,java-8,method-reference,Java,Reflection,Lambda,Java 8,Method Reference,我想知道是否有可能获得分配给构造函数的供应商的退货类型 例如 Supplier sFoo=Foo::new; 如何从供应商处获得“Foo.class”?我一直在用它来解决这个问题 这是有效的,例如: Supplier<Foo> sFoo = () -> new Foo(); Class<?> fooClasss = net.jodah.typetools.TypeResolver.resolveRawArguments(Supplier.class, sFoo.g

我想知道是否有可能获得分配给构造函数的供应商的退货类型

例如

Supplier sFoo=Foo::new;
如何从供应商处获得“Foo.class”?我一直在用它来解决这个问题

这是有效的,例如:

Supplier<Foo> sFoo = () -> new Foo();
Class<?> fooClasss = net.jodah.typetools.TypeResolver.resolveRawArguments(Supplier.class, sFoo.getClass())[0];
// fooClass == Foo.class
Supplier sFoo=()->new Foo();
类fooClasss=net.jodah.typetools.TypeResolver.resolveRawArguments(Supplier.Class,sFoo.getClass())[0];
//fooClass==Foo.class
但是,如果我将供应商指定为:
Supplier sFoo=Foo::new
,则无法解析退货类型


有什么想法吗?顺便说一句,我不必使用typetools…。

似乎typetools目前不支持解析方法引用。有一个类似的问题


一般来说,这种特性非常脆弱,因为没有指定运行时lambda表示,并且依赖于实现。所以有一天它可能会打破。如果您确实需要一个类,我建议您传递实际的
class
参数。

sFoo.get();但是,我不希望仅仅为了获取返回类型而调用该方法。通过其他方法获得它会很好。它确实处理方法引用,但不处理构造函数引用,因为它在构造函数的字节码签名具有
void
返回类型这一事实上遇到了麻烦(因此,构造函数需要特殊处理)。然而,你是对的,这是一个如此复杂的问题,不值得考虑。我也这么想,但我想看看是否有人有更好的想法。我想我唯一能做的就是避免使用构造函数引用或手动传入类。@akagixxer,如果您真的愿意继续使用它,那么另一个选项是向typeTools提交一个补丁。@akagixxer:请注意,对于任何类型的方法引用,这种攻击只返回目标方法的返回类型,这不一定与供应商的实际类型参数相匹配。对于lambda表达式,合成方法通常使用匹配的返回类型生成,这就是为什么它看起来工作得如此顺利。但除此之外,它还对JRE的内部工作做了很多假设,即使是最小的更改也可能使其崩溃。甚至有可能在当前的JRE中已经存在可以更改特定类的这些细节的角落案例。@霍尔格:听起来你的意思是,做我想做的事情的唯一可靠方法就是在我感兴趣的地方输入“.class”类型。来自更多的.NET背景,我仍然在学习Java的内部工作原理。。。
Supplier<Foo> sFoo = () -> new Foo();
Class<?> fooClasss = net.jodah.typetools.TypeResolver.resolveRawArguments(Supplier.class, sFoo.getClass())[0];
// fooClass == Foo.class