【问题标题】:How can I get the Array field of a class with reflection?如何获得具有反射的类的 Array 字段?
【发布时间】:2011-08-30 16:07:27
【问题描述】:

我的A班有

   AClaz[] rofl;

getDeclaredFields 的文档说“如果类或接口未声明任何字段,或者此 Class 对象表示原始类型、数组类或 void,则此方法返回长度为 0 的数组。 "

我想使用反射访问 AClaz 类型的 rofl 数组。即使 AClaz 是 A 类的内部类。

所以我会做 getDeclaredClass 吗?

【问题讨论】:

    标签: java arrays reflection


    【解决方案1】:

    您误读了文档 - 它正在谈论调用 getDeclaredFields on 数组类,如下所示:

    Class<?> arrayClass = String[].getClass();
    Field[] fields = arrayClass.getDeclaredFields();
    

    您应该能够毫无问题地从A 获取该字段

    Field[] fields = A.class.getDeclaredFields();
    

    然后遍历数组,或者

    Field roflField = A.class.getDeclaredField("rofl");
    

    field 类型是一个数组这一事实根本不是问题。

    【讨论】:

    • 啊哈,我明白了!即使 roflField 数组类型是内部类,它也能工作?至少要阅读它的价值观?我可以做 roflField.get(instance).doAclazMethod() 吗?
    • @AntonioP:不,因为roflField.get() 返回Object。您需要转换为正确的类型 (Aclaz[]),然后从中选择一个元素。例如:Aclaz[] values = (Aclaz[]) field.get(instance); values[0].doSomething();
    【解决方案2】:

    getDeclaredFields() 返回所有字段,即Field 类的实例。您想访问名为rofl 的字段之一,因此您可以遍历getDeclaredFields() 返回的数组或使用getDeclaredField("rofl")。然后,一旦有了 Field 的实例,就可以使用 set()get() 访问字段值本身。如果要设置值,则必须提供正确类型的值,即 AClaz 数组。

    如果您想更改类中存储在字段 rofl 中的现有数组的一个元素,您应该这样说:Array.set(field.get(instance), index, element)

    【讨论】:

      【解决方案3】:

      你可以得到这样的字段...

      Class<?> arrayClass = String[].getClass();
      Field[] fields =  arrayClass.getDeclaredFields();
      for(int i =0; i<fields.length; i++){
      
        if(fields[i].isArray()){
      //array type fields can be checked like this
          fields[i] is array
        }
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-02-14
        • 2011-08-20
        • 2011-01-16
        • 1970-01-01
        • 1970-01-01
        • 2022-01-08
        相关资源
        最近更新 更多