具体的なクラスではなく、Java インターフェイスを必要とする JRuby から Java API を呼び出したいと考えています。Java API は java.lang.reflect.proxy を使用して、インターフェースに基づく機能を実装します。JRuby で Java インターフェイスを実装する例を数多く見つけました。ただし、Java インターフェースを実装するのではなく、JRuby で単純に定義する必要があります。もちろん、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 メソッドに渡します。