脚本编写出问题了!大侠帮忙_脚本编写
脚本编写出问题了!大侠帮忙
问候,
介绍
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
脚本编写出问题了!大侠帮忙
脚本编写出问题了!大侠帮忙_脚本编写相关推荐
- 初学者编写python用什么软件好_初学者编写python用什么软件
初学者编写python用什么软件 以下是常用的几款Python代码编辑器和Python集成开发工具. 一.Python代码编辑器 1. Sublime Text Sublime Text是一款非常流行 ...
- 请编写出一个html页面 令其输出,javaweb程序设计案例教程_课后习题1.pdf
第一章 [测一测] 学习完前面的内容,下面来动手测一测吧,请思考以下问题: 1.请描述HTML .CSS. .JavaScript 分别表示的含义. 2 .请列举出HTML 常用的标记.(至少10 个 ...
- java 脚本如何编写的_如何编写Java程序的脚本输入
我正在编写一个 Java程序,要求其(技术)用户编写用作输入的脚本;它将这些脚本解释为一系列动作并执行它们.我目前正在寻找最简洁的方法来实现脚本/配置语言.我原本打算沿着XML路线前进,但所需输入的本 ...
- shell编写mysql全备和增备脚本_基于mysqldump编写自动全备增备的shell脚本
基于mysqldump编写自动全备增备的shell脚本 在线上MySQL数据库备份分为全备和增备,而xtrabackup备份已经支持了增量备份了,但是mysqldump就不支持增量备份,所以我们需要写 ...
- arcgis python脚本实现从界面选择输入输出_arcgis python脚本实现从界面选择输入输出_ArcGIS Python编程案例(2)-使用ArcPy编写脚本......
本章将涉及以下案例: 使用ArcGIS Python窗体 访问ArcPy 从脚本中执行工具 使用ArcGIS桌面软件帮助系统 使用变量存储数据 访问ArcPy中的模块 引言 地理处理任务往往是耗时且重 ...
- python是脚本语言不需要编译器编译执行_都有Python了,还要什么编译器!
编译的目的是将源码转化为机器可识别的可执行程序,在早期,每次编译都需要重新构建所有东西,后来人们意识到可以让编译器自动完成一些工作,从而提升编译效率. 但"编译器不过是用于代码生成的软机器, ...
- matlab 高斯迭代代码_用Matlab编写你的第一个有限元_《数值计算与程序设计》系列课程...
本课主要分析了有限元的基本理论, 不同于其他学习资料的是本文从数学的角度重新阐述了有限元分析的基本步骤,如通解与特解的讲解,并以一个偏微分方程实例,从基础插值出发,详细地讲解了有限元数学推导的每一步过 ...
- 修改器内置脚本编写_Node.js 中实践 Redis Lua 脚本
对别人的意见要表示尊重.千万别说:"你错了."--卡耐基 Lua 是一种轻量小巧的脚本语言,用标准 C 语言编写并以源代码形式开放,其设计目的是为了嵌入应用程序中,从而为应用程序提 ...
- 软件测试用例模板和例子_如何编写测试用例?
一.刚刚从事软件测试职业,如何快速掌握编写测试用例的方法?该怎样编写测试用例呢?专家分析:1.根据需求文档,完全按照需求文档框架/功能描述,根据自己的理解整理为用例.简单来说,就是将需求文档描述的内容 ...
最新文章
- Exchange-批量创建通讯组邮箱
- java 线程栈空间_java线程的内存不包含在JVM堆与栈中
- C++数组的左右旋转的实现算法(附完整源码)
- 手游频繁崩溃”闪退”? 从程序上找原因
- java 异常练习题_java入门异常处理练习题问题
- 关于代码手写UI,xib和StoryBoard
- 阻尼衰减曲线用python_高阻尼橡胶支座隔震原理
- 5G从小就梦想着自己要迎娶:高速率、低时延、大容量三个老婆。
- html有定位页面长度,html – 如何让div / span“填写”页面的剩余宽度/高度,并保持固定位置?...
- 线性代数与矩阵论 习题 1.2.1
- java车牌号识别EasyPR_EasyPR-Java
- webui之简单知识梳理
- 高等代数第3版下 [丘维声 著] 2015年版_3折购书优惠码限时抢(人工智能类)
- 五分钟理解什么是面向对象
- 抓包工具httpbuger的使用问题
- Assembly 调用的目标发生了异常
- Web全栈~27.文件和目录的操作
- 联想拯救者Y7000P键盘失灵
- ES-aggregations
- 2022最新Android面试题目解答,Android MVP模式详解