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

时间:2011-01-03 00:53:10

标签: java arrays class reflection

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

public Class<?> getArrayClass(String className, int dimensions) throws ClassNotFoundException {
    Class<?> elementType = Class.forName(className);
    return Array.newInstance(elementType, new int[dimensions]).getClass();
}

但是这需要我创建一个不需要的类实例。有没有办法在不创建实例的情况下执行此操作?

Class.forName(“[[[[[Ljava / lang / String;”)(或算法生成的版本)似乎并非在我见过的各种博客帖子的所有实例中正常工作。 (bugs.sun.com/bugdatabase/view_bug.do?bug_id=6434149)

2 个答案:

答案 0 :(得分:2)

使用[[[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> 
        ...

我目前没有看到使用带有自建类名的Class.forName()有任何问题(例如在[L之前加上,因为Java标准类也以相同的方式使用它。 / p>

Class arrayClass = Class.forName("[L" + "java.lang.String" + ";");

正如JavaDoc for Class.forName描述的那样,该类已加载但未初始化,您也不需要为其创建实例。

  

如果name表示   数组类,组件类型   数组类已加载但未加载   初始化。

关于各种博客文章的最后一句话,如果不起作用,将会很有意思。

答案 1 :(得分:-1)

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

关键在于我假设这里是调用类,对于大多数情况来说可能是知道这个类。

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. */
}