jdk7 新特性-Java语言的动态性-脚本语言支持api-使用案例06


_haha.js

function doSth() {
	jf.setSize(500, 300);
	jf.setVisible(true);
	jf.setDefaultCloseOperation(jf.EXIT_ON_CLOSE);
}


function getNames() {
	list.add("张三");
	list.add("李四");
	list.add("王五");
	return list;
}

function testJS() {
	println('Hello world!');
}

package org.yla.jsr223;

public interface JSLib {

	public int max_num(int a,int b);
}

package org.yla.jsr223;

import java.util.List;

import javax.crypto.spec.IvParameterSpec;
import javax.script.Compilable;
import javax.script.CompiledScript;
import javax.script.Invocable;
import javax.script.ScriptEngine;
import javax.script.ScriptEngineFactory;
import javax.script.ScriptEngineManager;
import javax.script.ScriptException;

import org.junit.Test;

public class TestJSR223 {
	
	
	/**
	 * 1 列出当前环境中支持的脚本引擎:
	 */
	@Test
	public void testJSR223Get(){
		//创建一个ScriptEngineManager管理器对象
		ScriptEngineManager manager = new ScriptEngineManager();
		//返回一个数组,该数组的元素是发现机制找到的所有 ScriptEngineFactory 类的实例
		List<ScriptEngineFactory> engineFactories = manager.getEngineFactories();
		for (ScriptEngineFactory scriptEngineFactory : engineFactories) {
			System.out.println("enginename: "+scriptEngineFactory.getEngineName());	
			System.out.println("engine version: "+scriptEngineFactory.getEngineVersion());	
			System.out.println("language name: "+scriptEngineFactory.getLanguageName());	
			System.out.println("language version: "+scriptEngineFactory.getLanguageVersion());	
			System.out.println("mimetypes: "+scriptEngineFactory.getMimeTypes() );	
			System.out.println("extension: "+scriptEngineFactory.getExtensions());	
		}
	}

	/**
	 * 2 在Java中使用javascript的Hello world示例
	 */
	@Test
	public void testSctiprEngineByHello(){
		ScriptEngineManager manager = new ScriptEngineManager();
		ScriptEngine engine =manager.getEngineByName("js");
		String script ="print ('hello')";
		try {
			engine.eval(script);
		} catch (ScriptException e) {
			e.printStackTrace();
		}
	}
	
	
	/**
	 * 3 传递变量
	 */
	@Test
	public void TestPassaVariable(){
		ScriptEngineManager manager = new ScriptEngineManager();
		ScriptEngine engine =manager.getEngineByName("js");
		engine.put("a", 4);
		engine.put("b", 5);
		try {
			Object maxNum = engine.eval("function max_num(a,b){"
					+ "						return (a>b)?a:b;"
					+ "					}max_num(a,b);");
			
			System.out.println("max_num: "+maxNum);
		} catch (ScriptException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
	
	/**
	 * 4 动态调用
	 */
	@Test
	public void DynamicInvocation(){
		ScriptEngineManager manager = new ScriptEngineManager();
		ScriptEngine engine =manager.getEngineByName("js");
		try {
			engine.eval("function max_num(a,b){return (a>b)?a:b;}");
			Invocable invoke =(Invocable) engine;
			Object maxNum=invoke.invokeFunction("max_num", 4,10);
			System.out.println(maxNum);
			maxNum=invoke.invokeFunction("max_num", 111,33);
			System.out.println(maxNum);
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
	
	/**
	 * 5 动态实现接口
	 */
	@Test
	public void DynamicInvocationImplementsInterface(){
		ScriptEngineManager manager = new ScriptEngineManager();
		ScriptEngine engine =manager.getEngineByName("js");
		try {
			engine.eval("function max_num(a,b){"
					+ "     return (a>b)?a:b;"
					+ "}");
			Invocable invoke =(Invocable) engine;
			JSLib jsLib =invoke.getInterface(JSLib.class);
			int maxNum =jsLib.max_num(33, 55);
			System.out.println(maxNum);
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
	
	/**
	 * 6 使用Java对象
	 */
	@Test
	public void useJavaObject(){
		ScriptEngineManager manager = new ScriptEngineManager();
		ScriptEngine engine =manager.getEngineByName("js");
		try {
			Compilable compEngine =(Compilable) engine;
			CompiledScript script =compEngine.compile("function max_num(a,b){ return (a>b)?a:b};");
			script.eval();
			Invocable invoke =(Invocable) engine;
			Object maxNum = invoke.invokeFunction("max_num", 1231,123123);
			System.out.println(maxNum);
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
	
}

package org.yla.jsr223;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;

import javax.script.Bindings;
import javax.script.Invocable;
import javax.script.ScriptContext;
import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;
import javax.swing.JFrame;

import org.apache.commons.io.IOUtils;

public class TestExecJS {

	public static void main(String[] args) throws Exception {
		// 根据js的后缀名生成一个解析JS的脚本解析引擎
		ScriptEngine engin = new ScriptEngineManager()
				.getEngineByExtension("js");
		// 查询一下这个引擎是否实现了下面很实用的接口
		System.out.println("引擎是否实现了Invocable接口: "+(engin instanceof Invocable));
		// 声明两个对象,传入到JS里面去
		JFrame jf = new JFrame("Swing窗口标题展示:YangLnAn");
		List list = new ArrayList();
		// 得到挷定的键值对象,把当前的两个JAVA对象放进去
		Bindings bind = engin.createBindings();
		bind.put("jf", jf);
		bind.put("list", list);
		
		// 把挷下的键值对象放进去,作用域是当前引擎的范围
		engin.setBindings(bind, ScriptContext.ENGINE_SCOPE);
		// 用引擎执行一段写在JS文件里面的代码
		Object obj = engin.eval(IOUtils.toString(ClassLoader.getSystemResource("org/yla/jsr223/_haha.js"),"UTF-8"));
		// 这个时候返回值当然 是null了
		System.out.println("打印Object对象: "+obj);
		System.out.println("--------------------无节操下划线-----------------------------");
		// 把当前的引擎强制转为Invocable,这样就可以调用定义在JS文件里面的一个一个函数了
		Invocable in = (Invocable) engin;
		// 得到了从JS里面返回来的对象
		System.out.println("--------------------执行js里面的getName方法-----------------------------");
		List l = (List) in.invokeFunction("getNames");
		System.out.println("打印List对象: "+l);
		// 调用一下定义在JS里面的另一个函数
		System.out.println("--------------------执行js里面的testJs方法-----------------------------");
		in.invokeFunction("testJS");
		System.out.println("--------------------执行js里面的doSth方法-----------------------------");
		// 最后调用一个函数,该函数可以使我们前面定义的窗体显示出来
		System.out.println("---------------------显示swing窗口-----------------------------------");
		in.invokeFunction("doSth");
		
	}
}




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值