Java 获取运行时提供的类名的n维数组的类

Java 获取运行时提供的类名的n维数组的类,java,arrays,class,reflection,Java,Arrays,Class,Reflection,给定一个完全限定的类名和许多维度,我想得到这个类的类名。我相信我可以这样做 public Class<?> getArrayClass(String className, int dimensions) throws ClassNotFoundException { Class<?> elementType = Class.forName(className); return Array.newInstance(elementType, new int[d

给定一个完全限定的类名和许多维度,我想得到这个类的类名。我相信我可以这样做

public Class<?> getArrayClass(String className, int dimensions) throws ClassNotFoundException {
    Class<?> elementType = Class.forName(className);
    return Array.newInstance(elementType, new int[dimensions]).getClass();
}
公共类getArrayClass(字符串类名称,int维度)抛出ClassNotFoundException{
Class elementType=Class.forName(className);
返回Array.newInstance(elementType,new int[dimensions]).getClass();
}
但是,这需要我创建一个不需要的类实例。有没有一种方法可以在不创建实例的情况下执行此操作


似乎Class.forName(“[[[Ljava/lang/String;”)或算法生成的版本在我所看到的各种博客文章中的所有实例中都不能正常工作。(bugs.sun.com/bugdatabase/view_bug.do?bug_id=6434149)

我能想到的唯一方法是传递类而不是字符串

重点是,我假设这里是,调用类,在大多数情况下可能知道该类

public V[] getArrayClass(Class<V> c, int dimensions) throws ClassNotFoundException {
    return (V[])Array.newInstance(c, new int[dimensions]).getClass();
    /* The type cast is required. Since Array.newInstance 
   is not genrically parameterized. */
}
public V[]getArrayClass(c类,int维)抛出ClassNotFoundException{
return(V[])Array.newInstance(c,newint[dimensions]).getClass();
/*类型转换是必需的。因为Array.newInstance
不是一般参数化的*/
}

使用
[[Ljava.lang.String;
符号是表示数组类名的标准方法

XMLEncoder和XMLDecoder使用标准Java功能来写入和读取数组:

String[][][] foo = new String[3][4][5];
foo[0][0][0] = "a";
foo[2][3][4] = "z";
XMLEncoder encoder = new XMLEncoder(System.out);
encoder.writeObject(foo);
encoder.flush();
encoder.close();
产生以下结果:

<?xml version="1.0" encoding="UTF-8"?> 
<java version="1.6.0_22" class="java.beans.XMLDecoder"> 
 <array class="[[Ljava.lang.String;" length="3"> 
  <void index="0"> 
   <array class="[Ljava.lang.String;" length="4"> 
    <void index="0"> 
     <array class="java.lang.String" length="5"> 
      <void index="0"> 
        <string>a</string> 
        ...
正如所描述的,类已加载但未初始化,您也不需要为其创建实例

如果
名称
表示 数组类的组件类型 数组类已加载,但未加载 初始化


你对各种博客文章的最后一句评论,如果这不起作用,你会很感兴趣地进行调查。

应该是[[[Ljava.lang.String;而不是[[Ljava.lang.String][[[[Ljava/lang/String;?不管怎样,各种帖子都说这在所有上下文中都是无效的。你不是在创建类的实例,而是一个零长度数组。为什么你认为,
的算法构造“[Lclassnamehere;”
string比构造零长度数组更便宜或更好?顺便说一句,链接的bug指的是
ClassLoader.loadClass(…)
而不是
Class.forName(…)
。我没有类。我正在使用asm读取类签名,并尝试从签名创建类。
Class arrayClass = Class.forName("[L" + "java.lang.String" + ";");