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