Как определить интерфейс 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: