[英]which is difference between “getConstructor()” and “getConstructor((Class<?>[]) null)”?
我尝试通过这个例子来理解这种差异:
import java.lang.reflect.*;
public class ClassDemo {
public static void main(String[] args) {
try {
// returns the Constructor object of the public constructor
//Class cls[] = new Class[] { String.class };
Constructor c = String.class.getConstructor();
System.out.println(c);
}
catch(Exception e) {
System.out.println(e);
}
}
}
我得到这个结果:
public java.lang.String()
在这个例子中,如果我替换:
Constructor c = String.class.getConstructor();
通过:
Constructor c = String.class.getConstructor((Class<?>[]) null);
我得到了相同的结果......
为什么和微妙的是什么?
提前致谢。
他们完全一样。
当您调用String.class.getConstructor()
,实际上有一个Class<?>
的空数组作为参数。 这等于使用(Class<?>[]) null
调用它,可以通过检查它将类型参数与构造函数中的类型参数进行比较的方式来看出:
private static boolean arrayContentsEq(Object[] a1, Object[] a2) {
if (a1 == null) {
return a2 == null || a2.length == 0;
}
if (a2 == null) {
return a1.length == 0;
}
if (a1.length != a2.length) {
return false;
}
for (int i = 0; i < a1.length; i++) {
if (a1[i] != a2[i]) {
return false;
}
}
return true;
}
如您所见,空数组和空值被视为等号。 您也可以使用new Class<?>[0]
作为参数来调用它。
没有区别,因为它是相同的方法, Class.getConstructor(Class ... parameterTypes) 。 允许在没有参数的情况下调用此方法。 这些被称为varargs 。
请阅读手册。
public java.lang.reflect.Constructor getConstructor(java.lang.Class[] parameterTypes)
它需要构造函数参数的类型。 如果构造函数重载,则需要它。
如果你写
System.out.println(String.class.getConstructor(String.class));
输出public java.lang.String(java.lang.String)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.