【问题标题】:Why can you execute Java-Code from a JS-ScriptEngine eval(String)?为什么可以从 JS-ScriptEngine eval(String) 执行 Java 代码?
【发布时间】:2016-01-01 06:05:12
【问题描述】:

像这样设置 JavaScript-ScriptEngine 后:

import javax.script.ScriptEngineManager;
import javax.script.ScriptEngine;
import javax.script.ScriptException;


public class Compute {

  public static void main(String[] args){
    try{

      ScriptEngineManager mgr = new ScriptEngineManager();
      ScriptEngine engine = mgr.getEngineByName("JavaScript");

      System.out.println(engine.eval(args[0]));
    } 
    catch(Exception e){
      System.out.println("Syntax Error!");
    }
  }

}

为什么你可以做这样的事情: java 计算 "java.util.Arrays.toString(new java.io.File(\".\").listFiles())"

“JavaScript”的 ScriptEngine 不应该只执行 JS 吗?

任何关于引擎实际做什么或为什么可能的链接,将不胜感激。

(编辑:这不是security problem with Java ScriptEngine 的重复,因为我想知道为什么这是可能的,而不是如何避免它)

【问题讨论】:

  • 查看ScriptEngineFactory::getMethodCallSyntax() 方法,在我看来,这个想法是允许您构建动态脚本(在您的情况下为JavaScript)函数然后执行它们。我不会在那个答案上花钱,但这是我通过快速搜索找到的。甚至不知道你能做到这一点,但有道理。令人着迷!
  • 啊.. 所以 getMethodCallSyntax() 充当转换器,让我的 Java 代码适应 JS 可以执行的东西?
  • 你想知道为什么提供这个功能或者它是如何实现的吗?
  • 为什么提供它以及为什么官方文档告诉你这么少,是我最大的兴趣:)

标签: javascript java


【解决方案1】:

您必须停下来想一想脚本引擎到底是做什么用的。引用officicial documentation(推荐阅读该主题):

使用 Java Scripting API,可以编写 Java 语言中可定制/可扩展的应用程序并离开 最终用户的自定义脚本语言选择

关键是您用 Java 编写大型旧应用程序,然后有另一方(可能是最终用户、使用您的“引擎/框架”的应用程序开发人员,或者如果您是企业级商店,则可能是专门的顾问)定制它以满足他们的需求。

这种自定义使用非编译语言(即 script)进行,例如 javascript (ECMAScript)。脚本引擎允许以您的小测试脚本演示的方式与 Java 类进行交互毕竟,这种交互是首先拥有脚本引擎的全部意义

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-02-21
    • 2013-04-17
    • 1970-01-01
    • 2010-11-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-20
    相关资源
    最近更新 更多