[英]how to get a array class using classloader in java?
我定义了一个类加载器名称 MyClassLoader。
cl = new MyClassLoader();
我可以使用 cl 加载我的 A 类。
Class c = cl.loadClass();
但是如何加载一个类是A[].class
?
我想你想像这样使用java.lang.reflect.Array.newInstance() -
A[] arr = java.lang.reflect.Array.newInstance(A.class, 10); /* for example */
假设您的ClassLoader
实现, MyClassLoader
已正确实现,您只需将数组类的规范名称传递给loadClass
方法。 例如,如果你试图加载Class
的类com.something.Foo
,你会使用
cl.loadClass("[Lcom.something.Foo");
您必须知道 Array 类型的类名是字符[
附加 X 次,其中 X 是数组维数,然后是字符L
。 然后附加数组类型的限定类名。 最后,您附加字符;
.
因此
Class<?> clazz = Class.forName("[Lcom.something.Examples;");
如果A[].class
是由同一个ClassLoader
加载的,它会给你返回的Class
实例。
请注意,您将无法以这种方式实例化此类型。 您必须使用Array.newInstance()
传递A
的Class
对象,对于一维数组,对于A[]
的Class
对象,对于二维数组等等。
在 Java 12 中,您可以调用someClass.arrayType()
来获取“someClass 数组”类。 如果你需要一个二维数组,那就是someClass.arrayType().arrayType()
。 当然,您可以像Class<?> someClass = someClassLoader.loadClass("com.example.A")
一样加载someClass
本身。
我在早期 Java 版本的标准 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(someClass, 1);
一种丑陋的解决方法,但是...与Class.forName
不同,您可以控制使用什么ClassLoader
,并且您不必编写另一个实用程序来生成有趣的名称,例如"[[I"
或"[Lcom.example.A;"
.
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.