class Test {
public static void main(String[] args) throws Exception {
Test t = new Test();
System.out.println(t.field);
System.out.println(t.getClass().getField("field").get(t));
int[] ar = new int[23];
System.out.println(ar.length);
System.out.println(ar.getClass().getField("length").get(ar));
}
public int field = 10;
};
当我运行上面的代码时,我在命令行上得到以下结果 -
10
10
23
Exception in thread "main" java.lang.NoSuchFieldException: length
at java.lang.Class.getField(Class.java:1520)
at Test.main(Test.java:9)
为什么我无法访问数组中的“长度”字段?
我认为这可能是JVM实现中的一个错误。这是我的推理:
根据 的文件 Class.getField
, getField
应该,作为其搜索算法的第(1)部分,找到 length
如果它被声明为公共字段:“如果C声明一个指定名称的公共字段,那就是要反映的字段。”
根据 Java语言规范,每个阵列都有 length
声明为“公共最终字段长度,其中包含数组的组件数”。
由于此字段被声明为具有名称 length
, getField
应该扔一个 SecurityException
如记录,或应返回 Field
目的。
现在有趣的是, Class.getFields
方法明确提到“此方法不反映数组类的隐式长度字段。用户代码应使用类Array的方法来操作数组。”这似乎并不平行 getField
,所以这可能是我的误读或只是糟糕的文档。
希望这可以帮助!
我认为这可能是JVM实现中的一个错误。这是我的推理:
根据 的文件 Class.getField
, getField
应该,作为其搜索算法的第(1)部分,找到 length
如果它被声明为公共字段:“如果C声明一个指定名称的公共字段,那就是要反映的字段。”
根据 Java语言规范,每个阵列都有 length
声明为“公共最终字段长度,其中包含数组的组件数”。
由于此字段被声明为具有名称 length
, getField
应该扔一个 SecurityException
如记录,或应返回 Field
目的。
现在有趣的是, Class.getFields
方法明确提到“此方法不反映数组类的隐式长度字段。用户代码应使用类Array的方法来操作数组。”这似乎并不平行 getField
,所以这可能是我的误读或只是糟糕的文档。
希望这可以帮助!
有一个特别的 java.lang.reflect.Array
类。 length
不是正常的领域。要访问它,有一种特殊的方法 getLength
。
在Java中,数组只是简单的对象。对象没有任何调用的字段 长度。这就是反思失败的原因。
请参见 http://docs.oracle.com/javase/specs/jls/se7/html/jls-10.html 有关如何实现数组的更多信息。
从文档......
数组的长度不属于其类型。