“getConstructor()”和“getConstructor((Class<?>[]) null)”有什么区别?

4

我尝试通过这个例子来理解它们之间的区别:

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();

by:

Constructor c = String.class.getConstructor((Class<?>[]) null);

我得到了相同的结果......为什么?有什么微妙之处吗?提前感谢您。
4个回答

4
他们完全做同样的事情。
当你调用 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;
}

正如您所看到的,空数组和null被视为相等。 您还可以使用new Class<?>[0]作为参数进行调用。


1

1

只需要阅读手册。

public java.lang.reflect.Constructor getConstructor(java.lang.Class[] parameterTypes)

它需要构造函数参数的类型,这在构造函数被重载的情况下是必需的。


0

如果你写下

    System.out.println(String.class.getConstructor(String.class));

输出 public java.lang.String(java.lang.String)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接