Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/361.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何查找JavaBean中包含的所有成员变量的字段_Java_Reflection_Properties_Depth First Search_Apache Commons Beanutils - Fatal编程技术网

如何查找JavaBean中包含的所有成员变量的字段

如何查找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

我想使用Java制作一个GUI,用户可以在其中选择一个bean,编辑其字段,然后将所创建bean的实例添加到队列中。我的问题是关于访问字段。我有一个从MyParentObject继承的类MyCompositeObject。MyParentObject由多个bean组成,每个bean由多个bean组成。MyCompositeObject类也由bean组成。我想从MyCompositeObject中查找所有可访问的字段

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))
返回;
}
}
后来,,
院长

谢谢。这让我大部分时间都很紧张。仍然需要考虑获取字段的所有字段的递归。