2016-04-29 31 views
4

我需要在代碼中使用反射,所以我的程序不會與每個不同的版本衝突。我想創建一個類的新實例,並且我想要使用的構造函數包含一個類的數組。但是這個階級也必須用反思來找到。這是我目前擁有的一個例子。帶反射的構造函數中的類數組

Constructor<?> constructor = getClass("className").getConstructor(getClass("anotherClass")); 

private Class<?> getClass(String name) { 
    return Class.forName("my.package." + version + "." + name); 
} 

但是構造不使用類,但這個類的一個數組,所以我怎麼會變成這個類到一個數組類型的呢?

回答

6

The Java Virtual Machine specification指定數組類型的類名。你可以建立這樣一個名字並使用Class#forName。但是,名稱的邏輯在基本類型和引用類型之間有所不同,因此可能會生成那些String名稱。

相反,您可以爲給定類型構造一個大小爲0的數組,並使用它來檢索其類型getClass()

例如

Class<?> componentType = Class.forName("java.lang.String"); 
Class<?> arrayType = java.lang.reflect.Array.newInstance(componentType, 0).getClass(); 
System.out.println(arrayType); 

將打印然後

class [Ljava.lang.String; 

arrayType將保持給定的數組類型的Class對象。您可以使用它來檢索構造函數。