Jython:阻止对java类的访问;更改输出流

Jython:阻止对java类的访问;更改输出流,java,jython,Java,Jython,我希望在一个Java项目中使用Jython。 我想知道两件事 我可以禁用从Python脚本访问Java类吗。也就是说,阻止脚本从java.util导入日期执行类似于的操作 我是否可以更改打印“Hello”etc写入的输出流,以便为实现重定向脚本输出 或者我必须编辑实际的Jython类才能禁用和更改它吗?为了限制对特定Java类的访问,您可以实现自定义类加载器并将其注册到Jython: this.pyInterpreter.getSystemState().setClassLoader(this.

我希望在一个Java项目中使用Jython。 我想知道两件事

  • 我可以禁用从Python脚本访问Java类吗。也就是说,阻止脚本从java.util导入日期执行类似于
    的操作

  • 我是否可以更改打印“Hello”etc写入的输出流,以便为实现重定向脚本输出


  • 或者我必须编辑实际的Jython类才能禁用和更改它吗?

    为了限制对特定Java类的访问,您可以实现自定义类加载器并将其注册到Jython:

    this.pyInterpreter.getSystemState().setClassLoader(this.userCodeClassLoader);
    
    如果您这样做是因为安全问题(不允许在运行用户代码的服务器计算机上执行某些操作),那么您必须注意,Jython还提供了类加载器无法捕获的内置函数实现:


    另一种方法是分析Python解析树中的所有导入。我认为最好有不止一个安全措施:

       String code = "import sys\n"+"from java.io import File\n"+"sys.exit()";
       AnalyzingParser anPar = new  AnalyzingParser(new ANTLRStringStream(code), "", "ascii");
    
       mod tree=anPar.parseModule();
       Visitor vis = new Visitor() {
           @Override
           public Object visitImport(Import node) throws Exception {
              System.out.println(node);
                           return node;
           }
    
           @Override
           public Object visitImportFrom(ImportFrom node) throws Exception {
              System.out.println(node);
                           return node;
           }
             };
       List<PythonTree> children=tree.getChildren();
       for (PythonTree c : children){
             vis.visit(c);
       }
    
    String code=“从java.io导入文件导入系统\n”+“sys.exit()”;
    AnalyzingParser anPar=新的AnalyzingParser(新的AntlStringStream(代码),“”,“ascii”);
    mod tree=anPar.parseModule();
    访客vis=新访客(){
    @凌驾
    公共对象visitImport(导入节点)引发异常{
    System.out.println(节点);
    返回节点;
    }
    @凌驾
    公共对象visitImportFrom(ImportFrom节点)引发异常{
    System.out.println(节点);
    返回节点;
    }
    };
    List children=tree.getChildren();
    适用于(PythonTree c:儿童){
    访问(c);
    }