我是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) {
// ...
}
}