繁体   English   中英

使用反射在Java数组中获取字段“length”

[英]Getting the field “length” in a Java array using reflection

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)

为什么我无法访问数组中的“长度”字段?

有一个特殊的java.lang.reflect.Array类。 length不是正常场。 要访问它,有一个特殊的方法getLength

我认为这可能是JVM实现中的一个错误。 这是我的推理:

  1. 根据Class.getField的文档getField应该作为其搜索算法的第(1)部分,如果它被声明为公共字段,则查找length :“如果C声明了一个具有指定名称的公共字段,那么该字段是反思。“

  2. 根据Java语言规范 ,每个数组的length声明为“公共最终字段长度,其中包含数组的组件数”。

  3. 由于此字段被声明为具有名称length ,因此getField应该按照文档记录抛出SecurityException ,或者应该返回Field对象。

现在有趣的是, Class.getFields方法明确提到“此方法不反映数组类的隐式长度字段。用户代码应该使用类Array的方法来操作数组。” 这似乎与getFieldgetField ,所以这可能是我的误读或者只是糟糕的文档。

希望这可以帮助!

在Java中,数组只是简单的对象。 对象没有任何名为length的字段。 这就是反思失败的原因。

有关如何实现数组的更多信息,请参阅http://docs.oracle.com/javase/specs/jls/se7/html/jls-10.html

从文档......

数组的长度不是其类型的一部分。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM