2

我想使用 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 方法,或者告诉我如何构建自己的方法。谢谢。

4

1 回答 1

3

这有点痛苦,但你必须进入两个维度

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

那么当然,你需要再次上去那个家伙的超类链,以确保你获得了类的所有字段,包括超类中的字段

一旦你有了那个字段的类链,你就可以通过重复上面的方法来获得它的字段....是的,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;
    }
}

后来,迪恩

于 2012-09-30T22:26:39.060 回答