如何在java中使用classloader获取数组类?

时间:2013-12-23 06:36:20

标签: java classloader

我定义了类加载器名称MyClassLoader。

cl = new MyClassLoader();

我可以使用cl来加载我的A类。

Class c = cl.loadClass();

但是如何加载A[].class的类?

3 个答案:

答案 0 :(得分:3)

我想你想这样使用java.lang.reflect.Array.newInstance() -

A[] arr = java.lang.reflect.Array.newInstance(A.class, 10); /* for example */

答案 1 :(得分:2)

您必须知道数组类型的类名是附加X次的字符[,其中X是数组维度的数量,然后是字符L。然后,您附加数组类型的限定类名。最后,添加角色;

因此

Class<?> clazz = Class.forName("[Lcom.something.Examples;");
如果由Class加载了A[].class,{p>会为您提供ClassLoader实例。

请注意,您无法以这种方式实例化此类型。您必须使用Array.newInstance()传递Class A对象作为一维数组,使用Class A[]对象作为二维{{1}}数组等等。

答案 2 :(得分:0)

在Java 8的标准API中找不到解决方案。因此,我编写了此实用程序方法:

/**
 * Returns the array type that corresponds to the element type and the given number of array dimensions.
 * If the dimension is 0, it just returns the element type as is.
 */
public static Class<?> getArrayClass(Class<?> elementType, int dimensions) {
    return dimensions == 0 ? elementType : Array.newInstance(elementType, new int[dimensions]).getClass();
}

然后您可以执行以下操作:

Class<?> arrayClass = getArrayClass(someClassLoader.loadClass("com.example.A"), 1);

有一个丑陋的解决方法,但是...与Class.forName不同,您可以控制使用ClassLoader的方式,而不必编写其他实用程序来生成有趣的名称,例如{{1 }}或"[[I"