【问题标题】:Caling getter methods on an Object using reflection which includes all composite object's getters as well使用反射在对象上调用 getter 方法,反射也包括所有复合对象的 getter
【发布时间】:2014-11-07 12:58:53
【问题描述】:

我想验证对象 A(比如 a)中的所有属性。类 A 具有复合对象 B,它具有自己的属性。

A类

public Class A {

      private String name;

      private B b;

      private Set<SomeObject> fields = new HashSet<SomeObject>();

      //getter and setters for name and b

}

B类

public Class B {

      private String address;

      private String dob;

      //getter and setters for address and dob

}

-----编辑 ----- 类 SomeObject

public Class SomeObject{

        private Double amount;

        //getter and setters for amount
}

使用反射获取值name和对象b的逻辑

    Field[] fields = a.getClass().getDeclaredFields();

    for (Field field : fields) {

        String fieldName = field.getName();
        System.out.println(" *** Field Name *** "   + fieldName);
        field.setAccessible(true);
        Object obj1 = field.get(a);
        System.out.println(" *** Object 1 *** " + obj1);
    }

--编辑 ---

我使用反射来动态获取 name 的值。但是我怎么知道属性 B 是复合对象还是另一个对象的集合,我应该对 B 应用反射以获取 addressdob 的值。同样,我如何从 Set 中获取值并在迭代中应用反射。没有迭代有没有更好的解决方案。

反过来,我应该确定一个类是包装类(字符串、整数等)还是用户定义的类(用户定义的 Bean)。如果包装类/原语则没有 getter 调用。同样,如果它是集合或其他东西,我应该迭代并在每个对象上应用反射以获得 amount

是否有任何可用的 java API 可以从复杂对象中提取这种级别的数据。例如 EquiBuilder、BeanUtils 等

谁能帮忙。

【问题讨论】:

    标签: java reflection comparison getter


    【解决方案1】:

    您可以使用Field.getType().isPrimitive() 来确定字段是否属于基本类型(int、bool 等)。如果不是,你有一些对象类型,如果字段的值不是null,你应该递归遍历被引用对象的字段。

    似乎没有内置方法可以区分原始包装器和其他 Java 类。 https://stackoverflow.com/a/1704658/1015327 有一个解决方法的建议,手动收集原始包装类。

    【讨论】:

    • 当它到达验证器层时,Wrapper 和用户定义的类类型对象都将不为空。它会被实例化/填充。
    【解决方案2】:

    没有简单或直接的方法来做你想做的事。有大量可能的字段类型。字段可以是原始的Collection、服装类型、DateUUIDJLabel等。

    如果您知道您可能会遇到的一组可能的内置类型,那么您也许可以破解它。首先获取字段的类型,然后通过对可能类型的一系列检查来运行该类型。如果找到匹配项,则强制转换并检索值。如果未找到匹配项,则可以假定这是具有自己的字段的自定义类型。

    您仍然需要担心扩展内置类型的自定义类型(例如自定义Map)。老实说,我不认为反思是要走的路。

    【讨论】:

    • 也许我可以用更好的方式提出这个问题。一个类不仅可以有包装类,如 Integer 或 String 等,还可以有任何其他 Java 提供的类,如 Set、List、Date 等。我正在编辑问题。
    猜你喜欢
    • 1970-01-01
    • 2011-02-15
    • 1970-01-01
    • 2014-05-23
    • 2013-03-23
    • 1970-01-01
    • 2019-02-13
    • 2023-04-05
    • 1970-01-01
    相关资源
    最近更新 更多