Как определить интерфейс Java в JRuby, а не реализовать его?

Я хотел бы вызвать API Java из JRuby, который требует интерфейса Java, а не конкретного класса. Java API использует java.lang.reflect.proxy для реализации функциональности на основе интерфейса. Я нашел множество примеров реализации Java-интерфейса с JRuby. Однако мне нужно просто определить интерфейс Java в JRuby, а не реализовывать его. Конечно, я могу определить интерфейс в Java и использовать его в качестве аргумента интерфейса для API через intf.java_class. Однако для удобства я хотел бы иметь возможность напрямую определять интерфейс из кода JRuby.

Обновление: вот API Java, который я хочу вызвать из JRuby:

public interface Query {
    <T> Collection<T> execute(Class<T> intf, String sql, Object... args);
}  

Java API требует, чтобы аргумент intf был интерфейсом, а не классом. Это связано с тем, что реализация использует java.lang.reflect.proxy для предоставления коллекции объектов данных, к которым можно получить доступ через предоставленный интерфейс. Java jlan.lang.reflect.proxy будет работать только с интерфейсами. В качестве примера предположим, что я читал строки из базы данных, которые представляли операторы журнала. Если бы я вызывал это из Java, я мог бы определить свои данные через

public interface LogRecord {
    int id();
    Timestamp when();
    String msg();
    String level();
    String logger();
    String thread();
}

и передайте LogRecord.class в качестве первого аргумента методу Query.execute.

1 ответ

Я не думаю, что это можно сделать, потому что класс Java должен был бы наследовать от интерфейса ruby, и, очевидно, классы Java не могут наследовать от класса JRuby:

https://github.com/jruby/jruby/wiki/CallingJavaFromJRuby

Другие вопросы по тегам