如何通过反射获取类的Array字段?

时间:2011-08-30 16:07:27

标签: java arrays reflection

我的A班有

   AClaz[] rofl;

getDeclaredFields的文档说:“如果类或接口没有声明字段,或者此Class对象表示基本类型,数组类,或void,则此方法返回长度为0的数组。 “

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

所以我会做getDeclaredClass?

3 个答案:

答案 0 :(得分:5)

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

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

您应该可以使用

A获取字段而不会出现任何问题
Field[] fields = A.class.getDeclaredFields();

然后迭代数组,或

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

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

答案 1 :(得分:1)

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

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

答案 2 :(得分:0)

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

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
  }
}