循环遍历java中对象的字段值(或方法)

时间:2016-06-21 12:41:26

标签: java reflection

我有一个名为Material的类及其中的一些子类:Book, Audio, magazine ... 我也有一个ArrayList<Material> arrayOfMaterials

我正在尝试实现一个搜索方法:我想给这个方法一个字符串作为参数,它应该调用数组中每个对象的所有getters(),以及toString函数并将结果与​​输入参数进行比较。

我已经阅读过关于java中的Reflection,但是如果我做对了,那将给我一个类的字段或方法的名称,但不会给我这些字段的值或对象的结果调用它getters()

我需要遍历所有getter或遍历所有字段(我不应该从外部访问字段,但它可以工作),并且Material的所有子类都不具有相同数量的字段。< / p>

有没有办法做到这一点?我没有要粘贴的代码,因为据我所知,没有办法做到这一点。

1 个答案:

答案 0 :(得分:0)

以下示例检索具体类的字段名称(declaredField =由类声明的字段,(public)field =由类及其超类声明的公共字段),派生出相应的名称来自它的getter(即private String example - &gt; getExample),搜索具有相同名称的方法并在m的实例Material上调用它

Material m = ...;
Stream.of(Material.class.getDeclaredFields())
      .map(field -> "get" + ucFirst(field.getName()))
      .map(getterName -> Material.class.getMethod(getterName))
      .map(getterMethod -> getterMethod.invoke(m))
      .forEach(fieldValue -> {
            //do something
      });

...
private String ucFirst(String input) {
    if(input.length() <= 1){
        return input.toUpperCase();
    }
    return input.substring(0, 1).toUpperCase() + input.substring(1);
}

(我删除了异常处理以提高可读性)

这只是一种方式,还有很多其他方式。与访问toString方法的方式相同:

String toString = (String)Material.class.getMethod("toString").invoke(m);

或者你可以得到你想要的所有吸气剂:

Stream.of(Material.class.getMethods())
      .filter(method -> method.getName().startsWith("get"))
      .map(getterMethod -> getterMethod.invoke(m))
      .forEach(fieldValue -> {
            //do something
      });

请注意,getMethods只会检索公共方法,但也会检索所有超类,而getDeclaredMethods只检索当前类的方法。在处理子类时,这可能很重要。