脚本编写出问题了!大侠帮忙
问候,
介绍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框架。 玩得开心。 我希望再次见到你们
下周
亲切的问候,
乔斯
脚本编写出问题了!大侠帮忙