我有一个名为Material
的类及其中的一些子类:Book, Audio, magazine
...
我也有一个ArrayList<Material> arrayOfMaterials
我正在尝试实现一个搜索方法:我想给这个方法一个字符串作为参数,它应该调用数组中每个对象的所有getters()
,以及toString
函数并将结果与输入参数进行比较。
我已经阅读过关于java中的Reflection,但是如果我做对了,那将给我一个类的字段或方法的名称,但不会给我这些字段的值或对象的结果调用它getters()
。
我需要遍历所有getter或遍历所有字段(我不应该从外部访问字段,但它可以工作),并且Material
的所有子类都不具有相同数量的字段。< / p>
有没有办法做到这一点?我没有要粘贴的代码,因为据我所知,没有办法做到这一点。
答案 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
只检索当前类的方法。在处理子类时,这可能很重要。