说我们有一个相当简单的java bean:
public class Test {
private String thing;
public void setThing(String thing) {
this.thing = thing;
}
public String getThing() {
return thing;
}
@Override
public String toString() {
return "Test{thing=" + thing + "}>";
}
}
然后我们使用Ruby的豆子:
java_import 'Test'
t = Test.new
t.thing = 'blah'
p t
输出为:
#<Java::Default::Test:0x5fdba6f9>
,但我认为我喜欢的是
#<Test{thing=blah}>
甚至可能只是
Test{thing=blah}
我知道我可以在所有Java类中添加一种称为inspect()
的方法,但是似乎每个实现都只会调用toString()
,因为Java中toString()
的意图通常与#inspect
的意图相同无论如何,在Ruby中(即,一个仅打算被开发人员看到的字符串(。
所以我想知道的是,当在任何Java对象上调用#inspect
时,是否有一种直接的方法告诉Jruby使用toString()
?
好吧,在任何其他Ruby实现中,我们都会将Object#inspect
方法修补,但是Java类是不可能的,因为它们的实现是本机的。但是您可以做这样的事情以使您的生活更轻松:
module JavaInspect
alias_method :inspect_without_to_string, :inspect
def inspect_with_string
self.respond_to?(:toString) ? self.toString : self.inspect_without_to_string
end
alias_method :inspect, :inspect_with_string
end
java_import 'Test'
Test.include(JavaInspect)
t = Test.new
t.inspect => "Test{thing=null}>"
t.inspect_without_to_string => "#<Java::Default::Test:0x4efac082>"
您只需要将模块包括到所需的类中。如果您真的很喜欢它,您甚至可以围绕java_import
创建包装器。
请注意,我不建议猴子补丁Object
,也不建议为生产代码创建类似的包装器,但是在开发中,这确实很有用,在某些情况下,在仔细考虑之后,它甚至可以在生产中使用。