0

具体的なクラスではなく、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 メソッドに渡します。

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 に答える