我定义了类加载器名称MyClassLoader。
cl = new MyClassLoader();
我可以使用cl来加载我的A类。
Class c = cl.loadClass();
但是如何加载A[].class
的类?
答案 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"
。