使用迭代方法遍历所有以 "get" 开头的方法并比较对象

14

有没有可能以某种方式迭代对象的每个方法,名称以“get”开头?我想比较两个非常复杂的自定义对象,它们的字段由基于其他自定义对象的数据结构组成。我想做的是获取每个get方法的结果的哈希码,并比较每个字段是否相等。

如果不太清楚,请原谅,如果您有问题,请问。感谢任何帮助和建议

我考虑过这样的方法:

for(method m : gettersOfMyClass){ 
boolean same = object1.m.hashCode() == object2.m.hashCode() 
} 

你想做类似于 get***() ..write?.. 的事情吗? - Ahmad
1
你是在尝试构建hashCode()equals的反射实现吗?你不能让你的IDE自动生成它们吗? - Louis Wasserman
获取器 - https://dev59.com/H2oy5IYBdhLWcg3wfOB4 - ant
对于你的第一个问题 - 是的,可以通过反射实现。但我认为这不是一个好的做法。 - iozee
我觉得在这种情况下 equals 方法不起作用...... 这是我第一次尝试这样的事情,所以我认为哈希码会起作用...... - LucasSeveryn
显示剩余2条评论
2个回答

30

是的,这是可能的,实际上这非常简单:

public static void main(String[] args) throws Exception {
  final Object o = "";
  for (Method m : o.getClass().getMethods()) {
    if (m.getName().startsWith("get") && m.getParameterTypes().length == 0) {
      final Object r = m.invoke(o);
      // do your thing with r
    }
  }
}

你好,你能解释一下这行代码的作用吗?final Object r = m.invoke(o); - LucasSeveryn
1
它在实例o上调用方法m并将结果分配给r。在m.getName()返回getXyz的情况下,它相当于Object r = o.getXyz() - Marko Topolnik

3

看起来是涉及反射概念的东西。逆向工程对象。

也许这就是你需要的。

示例类:

class Syndrome{
public void getMethod1(){}
public void getMethod2(){}
public void getMethod3(){}
public void getMethod4(){}
}

主方法:

Syndrome syndrome = new Syndrome();

Method[] methods = syndrome.getClass().getMethods();

for( int index =0; index < methods.length; index++){

if( methods[index].getName().contains( "get")){
    // Do something here
}

}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接