如果不一定要在对象上定义某个方法,该如何尝试对其进行调用?

时间:2018-07-31 23:11:12

标签: java reflection

这里的Java新手,请轻柔地对待我。我对Python和Ruby等鸭式语言有丰富的经验,但是对静态类型的语言却没有太多的经验,而Java的使用经验实际上为零。

我有一个对象数组,它们都是Cause class(即ArrayList<Cause>)的所有实例。我想知道这些对象中是否有一个与特定值匹配的属性upstreamRun。问题在于,只有UpstreamCause个对象具有此属性(UpstreamCauseCause的子类),并且数组中的所有对象并非都是UpstreamCause实例。

这是我第一次尝试:

causes.stream().anyMatch((Cause c) -> c instanceof hudson.model.Cause.UpstreamCause && c.getUpstreamRun() == run);

当然,由于upstreamRun()父类上未定义Cause,因此无法编译:

[ERROR] /home/jay/local/data/sis/workspace/henlo-world-plugin/src/main/java/org/jenkinsci/plugins/sample/HelloWorldAction.java:[17,138] cannot find symbol
  symbol:   method getUpstreamRun()
  location: variable c of type hudson.model.Cause

我也尝试了其他一些方法,但是所有这些方法都无法编译:

causes.stream().anyMatch((hudson.model.Cause.UpstreamCause c) -> c instanceof hudson.model.Cause.UpstreamCause && c.getUpstreamRun() == run);

causes.stream().anyMatch((Cause c) -> c.getClass().getMethod("getUpstreamRun", null) != null && c.getClass().getMethod("getUpstreamRun").invoke(c) == run);

我知道我可能采用了错误的方式,因为据我了解,Java开发人员认为反射和instanceOf是代码的味道。那么解决这个问题的正确方法是什么?

如果这是Ruby,我会这样做:

causes.any? do |c|
  c.getUpstreamRun() == run
rescue NoMethodError => e
  false
end

但是我猜想这种方法在Java中是回避的,即使不是,我也不知道如何用Java编写等效方法。

0 个答案:

没有答案