这是&#34; getConstructor()&#34;和&#34; getConstructor((Class <! - ? - > [])null)&#34;?

时间:2015-07-14 10:26:04

标签: java

我尝试通过这个例子来理解这种差异:

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

我得到了相同的结果......

为什么以及什么是微妙的?

提前致谢。

4 个答案:

答案 0 :(得分: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;
}

如您所见,空数组和空值被视为等号。您也可以使用new Class<?>[0]作为参数来调用它。

答案 1 :(得分:1)

没有区别,因为它是同一种方法Class.getConstructor(Class... parameterTypes)。 允许在没有参数的情况下调用此方法。这些被称为varargs

答案 2 :(得分:1)

请阅读手册。

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

它需要构造函数参数的类型。如果构造函数过载,则需要它。

答案 3 :(得分:0)

如果你写

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

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