2014-09-11 138 views
3

我是Java新手。我有一个问题如下:`String.class`和`new Class [] {String.class}`有什么区别?

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区别?

回答

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,你可以考虑持有直到你在学习如何规避它们之前牢牢掌握基本知识。

0

没有一个功能上的观点。

getConstructor方法有一个可变参数签名,您可以在其中提供可变数量的参数。内部Java将这个参数列表转换为一个数组,因此带有可变参数的签名与具有该类型数组的签名相同。

您的ctor1使用签名的可变参数“版本”,而您的ctor2使用数组“版本”。

-1

线#1将调用第一个构造
线#2将调用第二

public class MyObject { 

    public MyObject(String arg) { 
    // ... 
    } 

    public MyObject(String[] args) { 
    // ... 
    } 

} 
+0

不,两者都会调用第一个构造函数。 – 2014-09-11 09:11:19

2
public Constructor<T> getConstructor(Class<?>... parameterTypes) 
           throws NoSuchMethodException, 
            SecurityException 

看一看的getConstructor()认定中。它需要var-args参数类型Class (Class<?> ...)

在你的情况,这两个调用最终会调用相同的构造函数。