我是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 之间有什么区别?
答案 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<?> ...)
在您的情况下,两个调用最终都会调用相同的构造函数。
答案 2 :(得分:0)
从功能的角度来看都没有。
getConstructor方法有一个varargs签名,您可以在其中提供可变数量的参数。内部Java将此参数列表转换为数组,因此使用varargs的签名与具有该类型数组的签名相同。
当你的ctor2使用数组'版本'时,你的ctor1使用签名的varargs'版本'。
答案 3 :(得分:-1)
行#1
将调用第一个构造函数
第#2
行将调用第二个
public class MyObject {
public MyObject(String arg) {
// ...
}
public MyObject(String[] args) {
// ...
}
}