Делегирование глобальных функций Java с помощью Jython - PullRequest
0 голосов
/ 22 января 2020

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

Если это поможет Я ищу нечто подобное для Groovy DelegatingScript , где вы можете установить делегат тела скрипта для объекта Java / Groovy, чтобы функции объектов могли напрямую вызываться внутри сценарий DSL.

Есть ли способ добиться этого?

1 Ответ

0 голосов
/ 05 февраля 2020

Оказалось, это довольно легко сделать. Вы можете поместить функции stati c в класс Dsl, и они могут быть напрямую вызваны внутри скрипта.

Примечание: это не совсем то, что делает Groovy, потому что там вы привязываете локальную область видимости к объект, а не класс, но с некоторым размышлением это все еще может быть очень полезным.

Приложение. java

public final class App {
  public static void main(String[] args) throws Exception {
    try (PythonInterpreter py = new PythonInterpreter()) {
      py.exec("from hu.company.jythontest.Dsl import *");
      try (FileInputStream script = new FileInputStream("./etc/test.py")) {
        py.execfile(script);
      }
      var blocks = py.get("blocks", List.class);
      System.out.println(blocks.toString());
    }
  }
}

Dsl. java

public final class Dsl {
  public static class Block {
    private final String id;
    public Block(String id) {
      this.id = id;
    }
    public String getId() {
      return id;
    }
    @Override
    public String toString() {
      return id;
    }
  }
}

test.py

blocks = [Block('%d' % i) for i in range(10)]

Вывод:

[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
...