【问题标题】:How can I define a Java interface in JRuby rather than implement one?如何在 JRuby 中定义 Java 接口而不是实现一个?
【发布时间】:2014-04-08 10:40:05
【问题描述】:

我想从 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 方法。

【问题讨论】:

  • 您能否向我们展示一些您正在尝试实现的简化代码...从描述来看,仅在 JRuby 中/为 JRuby 引入接口似乎是多余的
  • 同意查看一些示例代码。反射 API 不区分接口和类,因此您只需创建一个具有正确方法的 JRuby 类并将其传入即可。

标签: jruby jruby-java-interop


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-25
    • 2011-06-05
    • 2012-09-22
    • 1970-01-01
    • 2012-08-22
    • 1970-01-01
    相关资源
    最近更新 更多