为什么可以从JS ScriptEngine eval(String)执行Java代码

Why can you execute Java-Code from a JS-ScriptEngine eval(String)?

本文关键字:String 执行 Java 代码 eval JS ScriptEngine 为什么      更新时间:2023-09-26

设置这样的JavaScript脚本引擎后:

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吗?

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

(编辑:这与Java ScriptEngine的安全问题没有重复,因为我想知道为什么这是可能的,而不是如何避免它)

您必须停下来思考一下脚本引擎到底是用来做什么的。引用官方文档(建议阅读该主题):

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

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

这种自定义是在非编译语言(即脚本)中进行的,如javascript(ECMAScript)。脚本引擎允许与Java类的交互,就像您的小测试脚本所展示的那样毕竟,这种交互首先就是拥有脚本引擎的全部意义