当前位置: 首页 > 知识库问答 >
问题:

使用Java反射访问嵌套字段

柳奇希
2023-03-14

假设我有几个这样的类:

public class A {
     public B element;
}

public class B {
     public C anotherElement; // where C refers to another type which contains types D, E, F, etc.....
}

我想迭代所有包含的子类(不是继承的),并获得嵌套对象树中所有字段的列表。但是,当我使用这样的反射代码时:

    Field[] myFields = providedObject.getClass().getDeclaredFields();
    for (Field myField : myFields) {
        // do something here?? to access the sub-fields of the class
        // if I print out myField.getName(), I get the element of class A, but I also want to access the anotherElement of class B (without hard-coding the name 'anotherElement', I want a full traversal of all nested fields)
    }

在“do somethine here”步骤中,我想访问myField的子字段,但在Field api中没有看到任何直接允许我这样做的内容。我试过:

MyField.getDeclaringClass(). getDeclaredFields()-

MyField.get类

那么如何从反射api访问嵌套字段呢?

谢谢。

共有2个答案

卓学智
2023-03-14

我添加了以下语句以退出递归方法。你可以随心所欲地改变它。

        if (clazz == null || clazz.isPrimitive() || !clazz.getPackage().getName().startsWith("com.vvv.stack02")) {
            return;
        }

其主要思想是,您需要通过键入以下行将字段转换为类。

Class<?> fieldClass = myField.getType();

public class Main {

    public static void main(String[] args) {
        printFields(A.class);
    }

    public static void printFields(Class<?> clazz) {

        if (clazz == null || clazz.isPrimitive() || !clazz.getPackage().getName().startsWith("com.vvv.stack02")) {
            return;
        }

        Field[] myFields = clazz.getDeclaredFields();
        for (Field myField : myFields) {
            System.out.println(clazz.getSimpleName() + "->" + myField.getType().getSimpleName() + ":" + myField.getName());
            Class<?> fieldClass = myField.getType();
            printField(fieldClass);
        }

    }

    public static class A {
        public B element;
    }

    public static class B {
        public C anotherElement; // where C refers to another type which contains types D, E, F, etc.....
    }

    public static class C {
        public Integer a;
    }

}
林劲
2023-03-14

这只是一点递归:

public static void traverseDepthFirst(Object obj) { // May need throws/catch!
    if (obj == null) {
        // ... do something for null ...
        return;
    }
    // ... perhaps do something different for arrays, primitives, String, etc.
    for (Field field : obj.getClass().getDeclaredFields()) {
        field.setAccessible(true);
        // ... pre-traversal code ...
        traverseDepthFirst(field.get(obj));
        // ... post-traversal code ...
    }
}

编辑:这将只考虑叶类。包括超级班。

public static void traverseDepthFirst(Object obj) { // May need throws/catch!
    if (obj == null) {
        // ... do something for null ...
        return;
    }
    // ... perhaps do something different for arrays, primitives, String, etc.
    for (
        Class<?> clazz = obj.getClass();
        clazz != null;
        clazz = clazz.getSuperclass()
    ) {
        for (Field field : clazz.getDeclaredFields()) {
            field.setAccessible(true);
            // ... pre-traversal code ...
            traverseDepthFirst(field.get(obj));
            // ... post-traversal code ...
        }
    }
}
 类似资料:
  • 问题内容: 如何通过反射访问对象的继承保护字段? 问题答案: 您可能会遇到两个问题-字段可能无法正常访问(私有),并且不在您正在查看的类中,而是位于层次结构中的某个位置。 这样的事情甚至可以解决这些问题:

  • 我有以下HTML代码的网页: 我试过这个。WebDriverWait(驱动程序,10).Unilt(ec.frame_to_available_and_switch_to_it((by.css_selector,“iframe.iframetgr”)))WebDriverWait(驱动程序,10).Unilt(ec.frame_to_available_and_switch_to_it((by.n

  • 我想映射到产品字段,而不创建类 应该如何序列化和反序列化?

  • 问题内容: 不固定f1.png值时如何访问inval值。即文件名可以是任何东西,它不知道,所以我如何使用Java访问此JSON中各种文件的inval字段值? 问题答案: 请尝试以下代码, 希望它能解决您的问题

  • 问题内容: 我正在尝试使用angular.js,hammer.js和topcoat制作和移动webapp。 我在显示像这样的Json文件中的数据时遇到了一些麻烦: 我的js文件是这样的: 我的HTML文件是这样的: 我想显示所有专辑,并且如果我的用户选择特定的艺术家,我想过滤那些专辑。 这里的问题是如何在此嵌套json上进行选择。顺便说一句,artist.name显示正确。 第二个问题是,如何过滤

  • 我从foursquare收到了一个json形式的响应。我尝试访问对象的某些部分,但没有成功。如何访问对象的地址?这是我试过的代码。 以下是json响应的一个示例: 完整的回应可以在这里找到