我正在尝试使用工厂设计模式来实例化对象。虽然构造函数有一个可变参数。
public class Foo implements Bar
public Foo(Object... args) {
}
在工厂中,我试图获取这样的构造函数:
private Constructor<Bar> getConstructor(Class<Bar> clazz) {
return clazz.getDeclaredConstructor(Object.class);
}
但是这不起作用。我也尝试过:
private Constructor<Bar> getConstructor(Class<Bar> clazz) {
return clazz.getDeclaredConstructor(Object[].class);
}
但是我会失去可变参数的 0 参数功能。
有什么办法可以做到这一点吗?
最佳答案
Varargs 参数实际上是一个数组参数,编译器和其他一些工具对其进行了特殊处理。因此,您不能将其用作具有反射的可变参数参数 - 您必须将其用作数组。
有更灵活的方法来处理方法 - MethodHandle
来自 java.lang.invoke
包的类。使用方法句柄,您不仅可以调用该方法,还可以转换参数以使用与方法签名不同的类型。
要使用可变参数构造函数,您可以这样做:
MethodHandle constructor = MethodHandles.publicLookup().findConstructor(Foo.class, Object[].class);
constructor.invoke(new Object(), 1, "");
关于Java:可变参数声明的构造函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27036047/