`String.class`和`new Class [] {String.class}`有什么区别?

时间:2014-09-11 07:36:18

标签: java reflection types constructor

我是Java的新手。我有一个问题如下:

class MyClass
{
    public MyClass(String s){}
}

MyClass MyObject;

Constructor ctor1 = MyObject.class.getConstructor(String.class); // #1
Constructor ctor2 = MyObject.class.getConstructor(new Class[]{String.class}); // #2

#1 #2 之间有什么区别?

4 个答案:

答案 0 :(得分:6)

没有区别。

getConstructor()的参数类型是Class<?>...,它使用varargs语法,这是一种语法糖,可以自动将任意大小的元素列表(包括零)转换为数组。

为了说明这两个电话是等价的:

Constructor ctor1 = MyObject.class.getConstructor(String.class, Integer.class); // #1
Constructor ctor2 = MyObject.class.getConstructor(new Class[]{String.class, Integer.class}); // #2

虽然我很佩服你“深思熟虑”(使用反思)的热情,但如果你是java新手,你可以考虑等到你掌握基础知识之后再学习如何规避它们。

答案 1 :(得分:2)

public Constructor<T> getConstructor(Class<?>... parameterTypes)
                              throws NoSuchMethodException,
                                     SecurityException

查看getConstructor()的定义。它需要类型为Class (Class<?> ...)

varargs 参数

在您的情况下,两个调用最终都会调用相同的构造函数。

答案 2 :(得分:0)

从功能的角度来看都没有。

getConstructor方法有一个varargs签名,您可以在其中提供可变数量的参数。内部Java将此参数列表转换为数组,因此使用varargs的签名与具有该类型数组的签名相同。

当你的ctor2使用数组'版本'时,你的ctor1使用签名的varargs'版本'。

答案 3 :(得分:-1)

#1将调用第一个构造函数
#2行将调用第二个

public class MyObject {

  public MyObject(String arg) {
    // ...
  }

  public MyObject(String[] args) {
    // ...
  }

}