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



我是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之间有什么区别?

没有区别。

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的新手,你可能会考虑推迟,直到你牢牢掌握了基本知识,然后再学习如何规避它们。

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

看看getConstructor()的定义。它采用var args类型为Class (Class<?> ...) 的参数

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

从功能角度来看没有。

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

您的ctor1使用签名的varargs"version",而您的ctor2使用数组"version"。

#1将调用第一个构造函数
线路#2将呼叫第二个

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

相关内容

  • 没有找到相关文章

最新更新