编程语言
首页 > 编程语言> > java-JRuby调用了错误的方法

java-JRuby调用了错误的方法

作者:互联网

JRuby调用Java方法时遇到一个奇怪的问题.

在我的Java类中,这些方法定义了两次,看来JRuby调用了错误的方法.

所以我尝试使用java_method,但是我总是得到:

TypeError: cannot convert instance of class org.jruby.RubyModule to class java.lang.Class

这是我的Java代码:

public class Renderer {

    ...
    public void addRenderer(IElementRenderer r) {
        System.out.println("Added element render: " + r.getClass().toString());

        basicRenderers.add(r);
        rendererMap.put(r.elementClass(), r);
    }

    public void addRenderer(IBasicRenderer r) {
        System.out.println("SHOULD NOT GO THERE !!");
        basicRenderers.add(r);
    }
}

和我的JRuby代码:

add_renderer = renderer.java_method :add_renderer, [Java::dragon.render.IElementRenderer]
add_renderer.call TextRenderer.new

我也尝试了java_send,但是出现了同样的错误:

renderer.java_send(:add_renderer, [Java::dragon.render.IElementRenderer], TextRenderer.new)

接下来,我尝试了:

renderer.add_renderer(TextRenderer.new.to_java(IElementRenderer))

这次没有错误,但是调用了错误的方法…

我该如何解决这个问题?

解决方法:

您可以修复无法使用java.lang.Class.for_name将org.jruby.RubyModule类的实例转换为类java.lang.Class的问题

在你的情况下

add_renderer = renderer.java_method :add_renderer, [java.lang.Class.for_name("dragon.render.IElementRenderer")]

这是因为Java接口默认情况下成为Ruby模块,而:java_method的第二个参数需要Class对象的数组.

您可以打印匹配的方法以查看它是否与预期的方法匹配.
例如,我看到以下代码与System.out上的println(String)匹配.

>>java.lang.System.out.java_method "println", [java.lang.Class.for_name("java.lang.String")]
#<Method: Java::JavaIo::PrintStream#(java.lang.String)>

标签:jruby,java
来源: https://codeday.me/bug/20191102/1992279.html