我的A班有
AClaz[] rofl;
getDeclaredFields的文档说:“如果类或接口没有声明字段,或者此Class对象表示基本类型,数组类,或void,则此方法返回长度为0的数组。 “
我想使用反射访问AClaz类型的rofl数组。即使AClaz是A类的内部阶级。
所以我会做getDeclaredClass?
答案 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
}
}