2011-08-30 59 views
1

我的类A有如何获得具有反射的类的数组字段?

AClaz[] rofl; 

为getDeclaredFields文档说“如果类或接口声明任何字段此方法返回长度为0的数组,或者如果该类对象表示一个基本类型,数组类,或无效。“

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

所以我会做getDeclaredClass?

回答

5

你误读的文档 - 它在谈论上调用getDeclaredFields数组类,像这样:

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

您应该能够从A获得现场不使用

任何问题
Field[] fields = A.class.getDeclaredFields(); 

然后遍历数组,或者

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

事实上,字段类型是一个数组根本不是问题。

+0

啊哈我看到!即使在roflField数组类型是内部类时它也能工作?至少要读取它的值?我可以做roflField.get(instance).doAclazMethod()吗? – rapadura

+3

@AntonioP:没有,因为'roflField.get()''返回Object'。您需要将其转换为正确的类型('Aclaz []'),然后从中选择一个元素。例如:'Aclaz [] values =(Aclaz [])field.get(instance);值[0] .doSomething();' –

+0

感谢的人!我现在明白了。 – rapadura

1

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

如果你想改变存储领域的现有阵列中的一个元素ROFL在你的类,你应该说是这样的:Array.set(field.get(instance), index, element)

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 
    } 
} 
相关问题