当前位置: 首页 > 面试题库 >

Java反射获取子类变量值/从成员字段获取对象实例

戚阳曜
2023-03-14
问题内容

说我有一个具有一些成员变量的类,一个或多个是具有成员变量的另一个类。如何获得两个类中每个变量的值?

我可以通过以下方式获取变量:通过调用getDeclaredFields();Foo对象的值,field.get(obj)然后再次对其进行迭代以获取子类变量。

但是,如何在没有该类实例的情况下获取每个子类成员变量的值?我的平凡示例之所以有用,是因为Bar该类的每个实例的变量都相同,因此我可以调用innerField.get(new Bar())

我想如果能以某种方式从字段中获取对象的实例,那可能会起作用?

提前致谢

第一个对象:

public class Foo {
    public Foo(){}
    private Integer someInt = 123;
    private Long someLong = 987654321L;
    private String someString = "qwertyuiop";
    private Bar bar = new Bar();
}

第二个对象:

public class Bar {
    public Bar(){}
    private Double someDouble = 123.456;
    private String innerString = "another String";
}

主/调用方法:

public static void main(String[] args) throws Exception {
    Foo foo = new Foo();
    getMemberFields(foo);
}

获取变量和值:

public static void getMemberFields(Object obj) throws IllegalAccessException,               NoSuchFieldException {
    Class<?> objClass = obj.getClass();
    System.out.println("obj: " + obj.getClass());

    Field[] fields = objClass.getDeclaredFields();
    for(Field field : fields) {
        field.setAccessible(true);
        System.out.println("Field: " + field.getName() + " value: " + field.get(obj));

        Field[] innerFields = {};
        if (!field.getType().getName().contains("java.lang")) {
             innerFields = field.getType().getDeclaredFields();
        }

        for (Field innerField: innerFields) {
            if (!innerField.getName().contains("java.lang")) {
                Object subObj = field.getType();

                innerField.setAccessible(true);
                System.out.println("");

                System.out.println("Sub Field: " + innerField.getName());
                System.out.println( "Sub Field value: " + innerField.get(new Bar()));
            }

        }
    }
}

输出量

obj: class Foo
Field: someInt value: 123
Field: someLong value: 987654321
Field: someString value: qwertyuiop
Field: bar value: Bar@61bbe9ba
Sub Field: someDouble
Sub Field value: 123.456
Sub Field: innerString
Sub Field value: another String

问题答案:

解决方案非常简单。如果有人遇到相同的问题,这就是我的解决方法。

private static HashMap<String, Object> getMemberFields(Object obj) throws IllegalAccessException,
        NoSuchFieldException
{
     HashMap<String, Object> fieldValues = new HashMap<String, Object>();
            Class<?> objClass = obj.getClass();

    Field[] fields = objClass.getDeclaredFields();
    for(Field field : fields)
    {
        field.setAccessible(true);
        fieldValues.put(field.getName(), field.get(obj));
        if (!field.getType().isPrimitive() && !field.getType().getName().contains("java.lang"))
        {
            getMemberFields(field.get(obj));
        }
    }
    return fieldValues;
}


 类似资料:
  • 现在,有没有可能通过反思来实现这一点呢?

  • 问题内容: 说,我有一个方法返回带有一些对象的自定义。他们归还了我。我需要从这些对象中获取某个字段的值,但是我不知道这些对象的类。 有没有办法通过Reflecion或其他方式做到这一点? 问题答案: 假设一个简单的情况,您的字段是: 但这很丑陋,我省略了所有尝试,并提出了许多假设(公共领域,可用的反射,不错的安全管理器)。 如果您可以更改返回a的方法,这将变得非常容易,因为迭代器随后可以为您提供类

  • 问题内容: 我试图通过反射接收字段值。问题是我不知道字段类型,必须在获取值时确定它。 这段代码会导致以下异常: 无法将java.lang.String字段com .... fieldName设置为java.lang.String 我尝试进行转换,但出现编译错误: 要么 我怎样才能做到这一点? 问题答案: 像之前回答的那样,你应该使用: 有时更喜欢的另一种方法是动态调用getter。示例代码: 还应

  • 问题内容: 我无法获取字段值。我想做的是在运行时获取对象。请让我知道我要去哪里了。 测试类 } EX.class } 问题答案: 像这样 或者,您可以使用类的方法在运行时获取对象的实例。您仍然需要首先设置该实例变量,否则它将没有任何值。 例如 或者,在其构造函数中有两个参数的地方,例如String和int … 或者您可以在运行时使用它为其构造函数查询 注意:我特意省略了将在此创建的对象强制转换为预

  • 比方说,我有一个方法,返回一个自定义的与一些对象。它们作为返回给我。我需要从这些对象中获取某个字段的值,但是我不知道对象的类。 有没有办法通过反射或其他方式做到这一点?

  • 问题内容: 我有一个具有String字段的对象。我可以通过致电获得该字段: 我设置了一个方法来设置此实例的字段的值,但是各个getter似乎是,这很奇怪,因为我希望它是。 如何获取实例的值? 问题答案: 如果使用,则“ setter”为,“ getter”为。在 这两种 情况下,第一个参数都是您要在其上访问字段的实例。