2016-04-29 48 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对象。您可以使用它来检索构造函数。