给定一个完全限定的类名和多个维度,我想得到这个类的类名。我相信我可以这样做
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)
答案 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. */
}