0

我想从需要 Java 接口而不是具体类的 JRuby 调用 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 方法。

4

1 回答 1

0

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

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

于 2014-04-16T05:31:16.420 回答