我试图使用工厂设计模式来实例化对象。虽然,构造函数有一个varargs参数。
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);
}
但是我将失去varargs的0参数功能。
有没有办法做到这一点?
答案 0 :(得分:1)
Varargs参数实际上是一个数组参数,由编译器和其他一些工具进行特殊处理。因此,您不能将它用作带反射的varargs参数 - 您必须将其用作数组。
有更灵活的方法来处理来自java.lang.invoke
包的{ - 3}}类方法。使用方法句柄,您不仅可以调用此方法,还可以将参数转换为使用与方法签名不同的类型。
要使用varargs构造函数,您可以这样做:
MethodHandle constructor = MethodHandles.publicLookup().findConstructor(Foo.class, Object[].class);
constructor.invoke(new Object(), 1, "");
答案 1 :(得分:0)
你尝试过吗?你不会失去这个“0参数功能”。拥有一个完全没有元素的数组是合法的。但是我将失去varargs的0参数功能。
你知道main()
的原型,对吗? public static void main(String... args)
。而且我相信您已经知道这也可以写成public static void main(String[] args)
。
你可以用以下方式调用你的主要内容:
java [whatever JVM args here] path.to.my.MainClass
即没有争论。 将分配一个数组,没有元素。
因此,即使在这种情况下,您的第二个代码也能正常工作。
此外,如果在类中声明至少一个构造函数,则不会生成缺省的no-arg构造函数。所以,最后,你是“安全的”。