使用Java6反射API,Class.getDeclaredFields
返回非常奇怪的值。类字段示例:
protected String[] arrF = new String[15];
在正确的getDeclaredFields
上使用Class
,会返回Field
:
arrF
[Ljava.lang.String;
问题:[L
前缀是否意味着arrF
是一个数组?我可以一直依赖它,即字段是iff类型以[L
为前缀的数组吗?如果不是,我如何获得有关该字段“数组”的一些信息?
答案 0 :(得分:5)
[
表示一维数组([[
是2维数组),L
后跟类/接口名称(Lclassname
)是该类型阵列。
Class#getName()
。我可以一直依赖它,即字段是iff类型以[L?
为前缀的数组
是。或者更好的是,使用Class#isArray()
。
答案 1 :(得分:2)
这是一个更好的方法!
import java.lang.reflect.Field;
import java.lang.reflect.Type;
import static java.lang.System.out;
public class ArrayFind {
public static void main(String... args) {
try {
Class<?> cls = Class.forName(args[0]);
Field[] flds = cls.getDeclaredFields();
for (Field f : flds) {
Class<?> c = f.getType();
if (c.isArray()) {
// ....
}
}
} catch (ClassNotFoundException x) {
x.printStackTrace();
}
}
}
顺便说一下。 byte []具有名称[B - [L表示长篇和/或引用。
答案 2 :(得分:0)
你得到的是所谓的二进制名称。二进制名称能够表示数组类型,因为Java中的数组不实现或扩展类似数组的接口。
[Ljava.lang.String;
表示:
[
单维数组L
引用类型数组,而不是基元java.lang.String;
表示数组的组件类型