脚本编写出问题了!大侠帮忙_脚本编写

脚本编写出问题了!大侠帮忙

问候,

介绍

Java不是Javascript,在大多数情况下,如果问题以错误的形式出现

论坛,他们将尽快移至其他论坛。 偶然这个

文章稍微讨论了Javascript,但它属于Java部分。

从Java 1.6版开始,脚本引擎随核心类一起打包。

脚本引擎是一个抽象的小框架,为其他引擎提供支持

语言,确切地说是脚本语言,也就是口译员。

Java版本1.6。 随附一种脚本语言:Javascript。 的

接下来的几段将介绍您可以使用此小框架做什么以及如何

可以做到。

脚本引擎管理器

ScriptEngineManager管理(单个)ScriptEngine。 ScriptEngine是Java的

脚本语言的界面。 经理不知道如何安装,

或实例化引擎本身:它使用所谓的ScriptEngineFactories用于

这个目的。 因此,如果要获取ScriptEngine,请向经理咨询

它; 经理检查其工厂之一是否可以实例化适当的

发动机; 如果是这样,它要求工厂这样做,经理将新的

调用者的ScriptEngine。

请注意,在这种简单情况下,我们(程序员)不需要处理

工厂自己。 这是一个简单的例子


ScriptEngineManager manager= new ScriptEngineManager();
ScriptEngine engine= manager.getEngineByName("JavaScript");
try {
    engine.eval("print('Hello, world!')");
} catch (ScriptException ex) {
    ex.printStackTrace();
}     
第一行实例化新经理。 第二行间接实例化

Java语言的ScriptEngine。 接下来的几行是ScriptEngine

工作一点; 这是强制性的“ hello world!” 用Java编写的程序

并从Java环境中执行(或“解释”)。

ScriptEngineFactory

工厂是此接口的实现。 工厂可以生产

ScriptEngines(请参见上一段)。 让我们看看那些工厂能告诉我们什么

我们; 这是一个例子:


ScriptEngineManager manager= new ScriptEngineManager();
List<ScriptEngineFactory> factories= manager.getEngineFactories(); 
for (ScriptEngineFactory factory: factories) { 
    String name = factory.getEngineName();
    String version = factory.getEngineVersion();
    String language = factory.getLanguageName(); 
    System.out.println(name+"("+version+"): "+language); 
    for(String n: factory.getNames()) 
              System.out.println(n);
} 
本示例再次实例化ScriptEngineManager并要求其提供列表

可用的ScriptEngineFactories。 对于每个工厂,其信息是

检索并打印。 请注意,语言不只是具有名称,

语言也被称为零个或多个别名; 内循环显示别名

名称(如果有)。

阅读API文档,以了解ScriptEngineFactory还可以为您做些什么。

当我在笔记本电脑上运行该小片段时,输出为:


Mozilla Rhino(1.6 release 2): ECMAScript
js
rhino
JavaScript
javascript
ECMAScript
ecmascript 
只有一个工厂安装了“ ECMAScript”语言。 那是

Javascript的旧名称; ScriptEngine的实现是Mozilla Rhino。 的

也可以使用别名“ js”,“ rhino”,“ Javascript”,

和其他一些变化。

ScriptEngineManager如何知道可用的ScriptEngineFactories?

为此,它使用了一个非常新的命名约定:包含工厂的罐子

(和引擎)必须存储在特殊目录中,并且经理检查

罐子的目录,并动态找出其中的工厂

那些罐子。 关于此机制的详细讨论超出了此范围。

文章。 也许在不久的将来,我将为该工厂建立工厂和发动机。

前一篇文章系列中介绍的小表达语言。

脚本引擎

ScriptEngine是Java到特定脚本解释器的网关。 但是哪里

该脚本来自哪里? 有两种向脚本提供脚本的方法:

将其传递给Reader或将其传递给String。 从阅读器读取脚本时

应该被阅读。 阅读器可以是任何阅读器:包裹在插座上

InputStream,或者仅仅是FileReader。 该脚本可以来自任何地方。

另一种选择是仅将整个脚本文本作为字符串传递。

脚本维护“绑定”。 绑定不过是Map <String,Object>,

即它将字符串与对象相关联。 引擎将这些绑定用于

脚本。 这是一个小例子:


ScriptEngineManager manager = new ScriptEngineManager();
ScriptEngine engine = manager.getEngineByName("JavaScript"); 
try {
    String expression = "a+b";
    engine.put("a", 41);
    engine.put("b", 1);
    Object result = engine.eval(expression);
    System.out.println(expression+"= "+result);
    System.out.println("type: "+result.getClass().getCanonicalName());
} catch(ScriptException se) {
    se.printStackTrace();
} 
这两个'engine.put()'方法调用都在引擎的绑定中添加了新的绑定:

a = 41和b = 1。 当我在笔记本电脑上运行此代码段时,我看到以下内容:


a+b= 42.0
type: java.lang.Double 
ScriptEngine足够聪明,可以将Javascript'42'转换为Java Double

目的。 它也足够聪明,可以将Java的整数'41'和'1'转换为

改正Javascript对象,以便可以评估“ a + b”。 那很可爱。

实际上,ScriptEngine可以将各种Java对象转换为

脚本的表示形式,然后再返回到Java的表示形式。

Javascript引擎甚至可以直接使用Java对象。 我直率地“借”

以下是同一主题的Sun文本中的以下示例:


ScriptEngineManager manager = new ScriptEngineManager();
ScriptEngine engine = manager.getEngineByName("JavaScript"); 
try {
    engine.eval(
        "importPackage(javax.swing);" +
        "var pane = " +
        "JOptionPane.showMessageDialog(null, 'Hello, world!');");
} catch (ScriptException ex) {
    ex.printStackTrace();
} 
好听的

脚本引擎不仅可以读取,解析和解释源文本,还可以使用源代码和文本文件。 他们编译

脚本文本转换为其内部形式。 这样的引擎实现了另一个接口,

Invocable界面。

这是显示如何使用此接口的示例:


ScriptEngineManager manager = new ScriptEngineManager();
ScriptEngine engine = manager.getEngineByName("JavaScript"); 
try {
    String expression = "function add(x, y) { return x+y; }";
    engine.eval(expression); 
    engine.put("a", 41);
    engine.put("b", 1); 
    Invocable invocable= (Invocable)engine; 
    System.out.println("add(1, 41)= "+invocable.invokeFunction("add", 1, 41));
    System.out.println("add(a, b)= "+invocable.invokeFunction("add", "a", "b"));
    System.out.println("add(a, b)= "+engine.eval("add(a, b)")); 
} catch(ScriptException se) {
    se.printStackTrace();
} catch (NoSuchMethodException nsme) {
    nsme.printStackTrace();
} 
首先编译小脚本“函数add(x,y){return x + y;}”,然后编写两个

绑定已添加。 接下来,将ScriptEngine强制转换为Invocable。 如果演员

失败(在此示例中没有),将引发异常,指示

特定脚本无法编译该脚本并保留以备后用。

当我运行这个小代码片段时,这是输出:


add(1, 41)= 42.0
add(a, b)= ab
add(a, b)= 42.0 
请注意,第二次调用尝试添加字符串值“ a”和“ b”,而不是

绑定中存在的值。 结果是字符串“ ab”显示

当将'+'运算符应用于字符串时,Javascript将字符串连接起来。

第三次调用再次正确使用a和b的绑定值。

结束语

这个相当新的小框架可以做很多事情。 的

框架是JSR 223完成的所有工作的结果,并且在此刻

他们正在为BeanShell解释器Ruby语言实现

和其他语言。 本文介绍了基本用法和结构

ScriptEngine框架。 玩得开心。 我希望再次见到你们

下周

亲切的问候,

乔斯

翻译自: https://bytes.com/topic/java/insights/712391-scripting

脚本编写出问题了!大侠帮忙

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值