如何在JRuby中定义Java接口而不是实现它?

时间:2014-03-06 02:19:43

标签: jruby jruby-java-interop

我想从JRuby调用需要Java接口的Java API,而不是具体的类。 Java API使用java.lang.reflect.proxy来实现基于接口的功能。我找到了很多用JRuby实现java接口的例子。但是,我需要在JRuby中简单地定义一个java接口,而不是实现一个。我当然可以在Java中定义一个接口,并通过intf.java_class将其用作API的接口参数。但是,为方便起见,我希望能够直接从JRuby代码中定义接口。

更新 这是我想从JRuby调用的Java API:

public interface Query {
    <T> Collection<T> execute(Class<T> intf, String sql, Object... args);
}  

Java API要求intf参数是接口,而不是类。这是因为实现使用java.lang.reflect.proxy来提供可以通过提供的接口访问的数据对象的集合。 Java的java.lang.reflect.proxy只适用于接口。例如,假设我正在从表示日志语句的数据库中读取行。如果我从java调用它,我可以通过

定义我的数据
public interface LogRecord {
    int id();
    Timestamp when();
    String msg();
    String level();
    String logger();
    String thread();
}

并将LogRecord.class作为Query.execute方法的第一个参数传递。

1 个答案:

答案 0 :(得分:0)

我不认为可以这样做,因为Java类必须从ruby接口继承,显然Java类不能从JRuby类继承:

https://github.com/jruby/jruby/wiki/CallingJavaFromJRuby#java-classes-cant-inherit-from-a-jruby-class