繁体   English   中英

如何在java中使用类加载器获取数组类?

[英]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()传递AClass对象,对于一维数组,对于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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM