Scripting 使用Jython将全局函数委托给Java

Scripting 使用Jython将全局函数委托给Java,scripting,jython,dsl,Scripting,Jython,Dsl,我想将用Java实现的函数绑定到Jython解释器实例的全局范围内(因此我不需要首先在脚本中手动导入它们) 如果这有帮助的话,我正在寻找一个类似的东西,您可以将脚本主体的委托设置为Java/Groovy对象,这样就可以在DSL脚本中直接调用对象函数 有什么办法可以做到这一点吗?事实证明,这很容易做到。 您可以将静态函数放入Dsl类中,这些函数可以在脚本中直接调用 注意:这与Groovy所做的并不完全相同,因为在这里您将局部范围绑定到一个对象而不是一个类,但有人认为这仍然非常有用 App.java

我想将用Java实现的函数绑定到Jython解释器实例的全局范围内(因此我不需要首先在脚本中手动导入它们)

如果这有帮助的话,我正在寻找一个类似的东西,您可以将脚本主体的委托设置为Java/Groovy对象,这样就可以在DSL脚本中直接调用对象函数


有什么办法可以做到这一点吗?

事实证明,这很容易做到。 您可以将静态函数放入Dsl类中,这些函数可以在脚本中直接调用

注意:这与Groovy所做的并不完全相同,因为在这里您将局部范围绑定到一个对象而不是一个类,但有人认为这仍然非常有用

App.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]