如何查找JavaBean中包含的所有成员变量的字段
我想使用Java制作一个GUI,用户可以在其中选择一个bean,编辑其字段,然后将所创建bean的实例添加到队列中。我的问题是关于访问字段。我有一个从MyParentObject继承的类MyCompositeObject。MyParentObject由多个bean组成,每个bean由多个bean组成。MyCompositeObject类也由bean组成。我想从MyCompositeObject中查找所有可访问的字段如何查找JavaBean中包含的所有成员变量的字段,java,reflection,properties,depth-first-search,apache-commons-beanutils,Java,Reflection,Properties,Depth First Search,Apache Commons Beanutils,我想使用Java制作一个GUI,用户可以在其中选择一个bean,编辑其字段,然后将所创建bean的实例添加到队列中。我的问题是关于访问字段。我有一个从MyParentObject继承的类MyCompositeObject。MyParentObject由多个bean组成,每个bean由多个bean组成。MyCompositeObject类也由bean组成。我想从MyCompositeObject中查找所有可访问的字段 Class MyParentObject { MyObjectOne f
Class MyParentObject
{
MyObjectOne fieldOne;
MyObjectTwo fieldTwo;
String name;
...
}
Class MyCompositeObject extends MyParentObject
{
MyObjectThree fieldThree;
Integer number;
...
}
Class MyObjectThree
{
boolean aBoolean;
MyObjectFour fieldFour;
...
}
我一直在尝试使用BeanUtils api,但我一直在尝试获取所有成员bean的字段。我所想象的是对可以从MyCompositeObject实例访问的所有字段进行深度优先搜索。例如,这将包括但不限于以下字段:MyCompositeObject.fieldOne、MyCompositeObject.number、MyCompositeObject.fieldThree.aBoolean
当我尝试时,我意识到:
Fields[] allFields = BeanUtils.getFields(myCompositeObject);
我在我的头上。到目前为止,我的研究还没有发现任何可以实现我所描述的功能的预构建方法。请让我知道任何可以做到这一点的API方法,或者告诉我如何构建自己的API方法。谢谢。这有点痛苦,但你必须进入二维空间
yourBeanClass.getSuperclass(); (and recursively get all superclasses until Object)
然后你可以得到每一个的字段
eachClass.getDeclaredFields() NOT getFields so you can get all the private fields
一旦你有了每个领域
field.getType() which returns the Class of that field
然后,当然,你需要再次进入dudes超类链,以确保获得类的所有字段,包括超类中的字段
一旦你有了这个字段的类链,你就可以通过重复上面的内容来获得它的字段了……是的,jdk让这变得很有趣!!!!我真希望他们有一个getAllDeclaredFields方法,这样我就不必去超类继承权了
重要提示:您需要调用field.setAccessible(true),这样当它是一个私有字段时,您就可以读写它了
下面是获取类的所有字段(包括超类)的代码
private static List<Field> findAllFields(Class<?> metaClass) {
List<Field[]> fields = new ArrayList<Field[]>();
findFields(metaClass, fields);
List<Field> allFields = new ArrayList<Field>();
for(Field[] f : fields) {
List<Field> asList = Arrays.asList(f);
allFields.addAll(asList);
}
return allFields;
}
private static void findFields(Class metaClass2, List<Field[]> fields) {
Class next = metaClass2;
while(true) {
Field[] f = next.getDeclaredFields();
fields.add(f);
next = next.getSuperclass();
if(next.equals(Object.class))
return;
}
}
私有静态列表findAllFields(类元类){
列表字段=新的ArrayList();
findFields(元类、字段);
List allFields=new ArrayList();
for(字段[]f:字段){
List asList=Arrays.asList(f);
allFields.addAll(asList);
}
返回所有字段;
}
私有静态void findFields(类metaClass2,列表字段){
下一个类=元类2;
while(true){
字段[]f=next.getDeclaredFields();
字段。添加(f);
next=next.getSuperclass();
if(next.equals(Object.class))
返回;
}
}
后来,,
院长谢谢。这让我大部分时间都很紧张。仍然需要考虑获取字段的所有字段的递归。