我的班级A有
AClaz[] rofl;
getDeclaredFields的文档说:"如果类或接口没有声明字段,或者这个class对象表示基本类型,是数组类,或void,这个方法返回一个长度为0的数组。"
我想使用反射访问类型为AClaz的rofl数组。即使AClaz是类a的内部类
写入getDeclaredClass ?
你误读了文档-它正在谈论在上调用getDeclaredFields
一个数组类,像这样:
Class<?> arrayClass = String[].getClass();
Field[] fields = arrayClass.getDeclaredFields();
您应该能够使用
从A
中获得字段而没有任何问题Field[] fields = A.class.getDeclaredFields();
,然后遍历数组,或者
Field roflField = A.class.getDeclaredField("rofl");
字段类型是一个数组,这根本不是问题。
getDeclaredFields()
返回所有字段,即Field
类的实例。您希望访问名为rofl
的字段之一,因此可以遍历getDeclaredFields()
返回的数组,也可以使用getDeclaredField("rofl")
。然后,一旦您有了Field的实例,您就可以使用set()
和get()
访问字段值本身。如果你想设置值,你必须提供正确类型的值,即AClaz数组。
如果你想改变你的类中存储在字段rofl中的现有数组的一个元素,你应该这样说:Array.set(field.get(instance), index, element)
你可以得到这样的字段…
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
}
}