Java 使用包含所有合成对象的反射在对象上校准getter方法';它也是一种吸气剂

Java 使用包含所有合成对象的反射在对象上校准getter方法';它也是一种吸气剂,java,reflection,comparison,getter,Java,Reflection,Comparison,Getter,我想验证对象A(比如A)中的所有属性。类A有复合对象B,它有自己的属性 甲级 public Class A { private String name; private B b; private Set<SomeObject> fields = new HashSet<SomeObject>(); //getter and setters for name and b } -----编辑------ 类对象 pu

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

甲级

public Class A {

      private String name;

      private B b;

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

      //getter and setters for name and b

}
-----编辑------ 类对象

public Class SomeObject{

        private Double amount;

        //getter and setters for amount
}
使用反射获取值名称和对象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的值。同样,我如何从集合中获取值并在迭代中应用反射。有没有一个没有迭代的更好的解决方案

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

是否有可用的JavaAPI可以从复杂对象中进行这种级别的数据提取。如造马人、小海狸等

有人能帮忙吗。

您可以用它来确定字段是否为基元类型(int、bool和c)。如果不是,则您有一些对象类型,如果字段的值不是
null
,则应递归遍历引用对象的字段


似乎没有内置的方法来区分原始包装器和其他Java类。有一个解决方法的建议,手动收集原始包装器类。

没有简单或直接的方法来做您想要做的事情。有大量可能的字段类型。该字段可以是基元、
集合、
服装类型、
日期、
UUID
JLabel

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


您仍然需要担心扩展内置类型的自定义类型(例如自定义
Map
)。老实说,我不认为反射是解决问题的方法。

当它到达验证程序层时,包装器和用户定义的类类型对象都不会为null。它会被实例化/填充。也许我可以用更好的方式提出这个问题。一个类不仅可以有整数或字符串等包装类,还可以有其他Java提供的类,如Set、List、Date等。我正在编辑这个问题。
    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);
    }