Вызов Jython из Java (Jython-скрипт вызывает Java, который затем должен вызвать Jython)

Мой Jython-скрипт вызывает некоторый код, который я пишу на Java (потому что мне удобнее с многопоточностью Java). Теперь выясняется, что мне нужно вызвать один из методов Jython из Java (в противном случае мне пришлось бы переписать его на Java).

Легко управлять Java из Jython, а также просто настроить все так, чтобы Java был главным, а Jython - подчиненным, но не так очевидно, как лучше настроить его так, чтобы они могли вызывать друг друга.

Официальная документация содержит очень длинную статью обо всем этом: Глава 10: Интеграция Jython и Java, которая на первый взгляд делает задачу трудной: фабрики объектов один-к-одному, слабо связанные фабрики и много кода для создания это работает.

Я нашел и другие источники, которые также вошли в подробности, но ни один не предлагает простых решений:

Поскольку уже работает интерпретатор Jython, должен быть простой способ вызова метода в нем без необходимости создания экземпляра нового интерпретатора (как в последней ссылке выше, и как вам нужно было бы сделать, если бы Java управляла Jython), Есть ли на самом деле такой способ?

1 ответ

Эта статья предложила простое решение, и следующий пример сработал. Джава:

import org.python.core.PyObject;

public class JythonFromJava {
    public void callPO(PyObject po) {
        po.__call__();
    }
}

Составлено с:

$ javac -classpath ".;C:\Programs\jython2_7b1\jython.jar" JythonFromJava.java

Jython:

import JythonFromJava

def method():
    print "METHOD called"

j = JythonFromJava()
j.callPO(method)

Запуск это:

$ jython jython_from_java_j.py 
METHOD called

Кажется, это все, что нужно. Нам нужно отправить дескриптор метода Jython в Java как своего рода обратный вызов, за исключением того, что в этом случае это не инструмент для асинхронных запросов, а для запросов между языками.


РЕДАКТИРОВАТЬ: Я не уверен, где это оставляет нас с многопоточностью. Я буду вызывать метод Jython из другого потока, который создан и запущен в коде Java, поэтому я надеюсь, что интерпретатор Jython обеспечивает синхронизированный доступ к самому себе...

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