Java:varargs声明了构造函数

时间:2014-11-20 09:32:00

标签: java design-patterns factory variadic-functions

我试图使用工厂设计模式来实例化对象。虽然,构造函数有一个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参数功能。

有没有办法做到这一点?

2 个答案:

答案 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)

  

但是我将失去varargs的0参数功能。

你尝试过吗?你不会失去这个“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构造函数。所以,最后,你是“安全的”。