<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>-Flyぁ梦- &#187; 脚本</title>
	<atom:link href="http://blog.11034.org/tag/%e8%84%9a%e6%9c%ac/feed" rel="self" type="application/rss+xml" />
	<link>http://blog.11034.org</link>
	<description></description>
	<lastBuildDate>Sun, 22 Jun 2025 08:59:05 +0000</lastBuildDate>
	<language>zh-CN</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>https://wordpress.org/?v=4.2.38</generator>
	<item>
		<title>Java用ScriptEngine解析脚本</title>
		<link>http://blog.11034.org/2010-12/java_scriptengine.html</link>
		<comments>http://blog.11034.org/2010-12/java_scriptengine.html#comments</comments>
		<pubDate>Fri, 24 Dec 2010 14:42:33 +0000</pubDate>
		<dc:creator><![CDATA[-Flyぁ梦-]]></dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[Javascript]]></category>
		<category><![CDATA[百度]]></category>
		<category><![CDATA[脚本]]></category>

		<guid isPermaLink="false">http://blog.stariy.org/?p=738</guid>
		<description><![CDATA[实习第一期的任务基本做完，从python和django的世界又回到了Java，当初来刚来百度的时候怎么也没想到 [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>实习第一期的任务基本做完，从python和django的世界又回到了Java，当初来刚来百度的时候怎么也没想到居然还会用上Java。新的任务也很简单，不过正好学习了Java一个新的script包，可以用来解析脚本语法。</p>
<p>javax.script，始于JDK1.6，不过现在只有sun实现的javascript的解析器，难道是因为主要用来解析js语法所以归类到JEE的范畴？不过基本足够了，一般的用途主要是能解析通用的表达式就好，比如X &gt;= 1<span id="more-738"></span>（X作为参数传入）这样的表达式，也能利用js的函数语法，创造一个就像java的函数一样存在于内存中随时可以被调用的函数，更可以将js中的对象直接转换成java对象。</p>
<p>script包下最主要的是ScriptEngineManager、ScriptEngine、CompiledScript和Bindings 4个类或接口。</p>
<p>ScriptEngineManager是一个工厂的集合，可以通过name或tag的方式获取某个脚本的工厂并生成一个此脚本的ScriptEngine，目前只有javascript的工厂。通过工厂函数得到了ScriptEngine之后，就可以用这个对象来解析脚本字符串了，直接调用Object obj = ScriptEngine.eval(String script)即可，返回的obj为表达式的值，比如true、false或int值。</p>
<p>CompiledScript可以将ScriptEngine解析一段脚本的结果存起来，方便多次调用。只要将ScriptEngine用Compilable接口强制转换后，调用compile(String script)就返回了一个CompiledScript对象，要用的时候每次调用一下CompiledScript.eval()即可，一般适合用于js函数的使用。</p>
<p>Bindings的概念算稍微复杂点，我的理解Bindings是用来存放数据的容器。它有3个层级，为Global级、Engine级和Local级，前2者通过ScriptEngine.getBindings()获得，是唯一的对象，而Local Binding由ScriptEngine.createBindings()获得，很好理解，每次都产生一个新的。Global对应到工厂，Engine对应到ScriptEngine，向这2者里面加入任何数据或者编译后的脚本执行对象，在每一份新生成的Local Binding里面都会存在。</p>
<p>给个代码的例子，其中的functionScript可以从标准输入stdin或者配置文件等地方获得，这样就可以动态的控制Java代码的运行结果</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
</pre></td><td class="code"><pre class="java" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">try</span> <span style="color: #009900;">&#123;</span>
	ScriptEngine engine <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> ScriptEngineManager<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>.<span style="color: #006633;">getEngineByName</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;javascript&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	Compilable compilable <span style="color: #339933;">=</span> <span style="color: #009900;">&#40;</span>Compilable<span style="color: #009900;">&#41;</span> engine<span style="color: #339933;">;</span>
	Bindings bindings <span style="color: #339933;">=</span> engine.<span style="color: #006633;">createBindings</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">//Local级别的Binding</span>
	<span style="color: #003399;">String</span> script <span style="color: #339933;">=</span> <span style="color: #0000ff;">&quot;function add(op1,op2){return op1+op2} add(a, b)&quot;</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">//定义函数并调用</span>
	CompiledScript JSFunction <span style="color: #339933;">=</span> compilable.<span style="color: #006633;">compile</span><span style="color: #009900;">&#40;</span>script<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">//解析编译脚本函数</span>
	bindings.<span style="color: #006633;">put</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;a&quot;</span>, <span style="color: #cc66cc;">1</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>bindings.<span style="color: #006633;">put</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;b&quot;</span>, <span style="color: #cc66cc;">2</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">//通过Bindings加入参数</span>
	<span style="color: #003399;">Object</span> result <span style="color: #339933;">=</span> JSFunction.<span style="color: #006633;">eval</span><span style="color: #009900;">&#40;</span>bindings<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #003399;">System</span>.<span style="color: #006633;">out</span>.<span style="color: #006633;">println</span><span style="color: #009900;">&#40;</span>result<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">//调用缓存着的脚本函数对象，Bindings作为参数容器传入</span>
<span style="color: #009900;">&#125;</span>
<span style="color: #000000; font-weight: bold;">catch</span> <span style="color: #009900;">&#40;</span>ScriptException e<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

<p>另外还有一个ScriptContext的概念，这个可能很少用到吧，它是用来连接ScriptEngine和Bindings的工具。按照JDK的解释：该接口的实现类被用来连接ScriptEngine和宿主应用程序中的对象（如有范围的Bindings）。</p>
<h4  class="related_post_title">随便看一看</h4><ul class="related_post"><li>2014-09-22 -- <a target="_blank" href="http://blog.11034.org/2014-09/wuzhen.html" title="乌镇真没意思">乌镇真没意思</a></li><li>2014-07-07 -- <a target="_blank" href="http://blog.11034.org/2014-07/jay.html" title="杰伦，祝你幸福！">杰伦，祝你幸福！</a></li><li>2014-06-17 -- <a target="_blank" href="http://blog.11034.org/2014-06/onchange_of_input.html" title="小心使用input的onchange事件">小心使用input的onchange事件</a></li><li>2011-02-14 -- <a target="_blank" href="http://blog.11034.org/2011-02/throw_away_auto_widget.html" title="抛弃边栏widget的自动显示">抛弃边栏widget的自动显示</a></li><li>2016-06-08 -- <a target="_blank" href="http://blog.11034.org/2016-06/tomcat_shutdown.html" title="Tomcat监听shutdown释放数据库连接池">Tomcat监听shutdown释放数据库连接池</a></li></ul><h4 class="related_post_title">看看 Java , Javascript , 百度 </h4><ul class="related_post"><li>2010-11-27 -- <a target="_blank" href="http://blog.11034.org/2010-11/image_resize_in_java_and_python.html" title="Python和Java处理图片缩放，C#友情支持">Python和Java处理图片缩放，C#友情支持</a></li><li>2010-06-08 -- <a target="_blank" href="http://blog.11034.org/2010-06/javaee_webim.html" title="J2EE大程，WebIM系统">J2EE大程，WebIM系统</a></li><li>2016-09-09 -- <a target="_blank" href="http://blog.11034.org/2016-09/64bits_linux_arena_memory.html" title="64位Linux下Java进程堆外内存迷之64M问题">64位Linux下Java进程堆外内存迷之64M问题</a></li><li>2016-08-18 -- <a target="_blank" href="http://blog.11034.org/2016-08/java_concurrency_in_practice.html" title="读java concurrency in practice">读java concurrency in practice</a></li><li>2016-08-05 -- <a target="_blank" href="http://blog.11034.org/2016-08/thread_stop.html" title="线程清理">线程清理</a></li>]]></content:encoded>
			<wfw:commentRss>http://blog.11034.org/2010-12/java_scriptengine.html/feed</wfw:commentRss>
		<slash:comments>17</slash:comments>
		</item>
	</channel>
</rss>
