【发布时间】: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 类并将其传入即可。