2014-09-11 137 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<?> ...)

在你的情況,這兩個調用最終會調用相同的構造函數。