jdk6.0从入门到精通-----chapter18与动态语言结合

动态语言即解释性语言,即脚本语言。是一种在执行期间才去发现数据类型的编程语言。主要的动态语言如PHP,perl,Ruby,Python,SmallTalk,JavaScript,VBScript等等

以下主要是java与JavaScript结合的例子
jdk6.0中的bin文件夹下有一个jrunscript命令,是一个脚本解释程序,用于测试脚本语言的正确与否,默认为JavaScript
在cmd下输入jrunscript,回车
即进入js>,输入println("hello"),会显示hello

整个ch18的项目结构:

jdk6.0从入门到精通-----chapter18与动态语言结合_第1张图片

scripting API是java程序用于书写脚本程序的API,包含在javax.script包中,
该包中有一个ScriptEngineManager类,是使用scripting API的入口。
使用步骤:
1创建ScriptEngineManager的实例,
2通过ScriptEngineManager获得ScriptEngine对象,
3利用ScriptEngine对象的eval()方法执行脚

第一个简单例子:

package javaScript;

import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;
import javax.script.ScriptException;

public class HelloScript {

	public static void main(String[] args) {

		ScriptEngineManager factory = new ScriptEngineManager();
		ScriptEngine engine = factory.getEngineByName("JavaScript");
		try {
			engine.eval("print('hello')");
		} catch (ScriptException e) {
			e.printStackTrace();
		}
	}

}


第二个例子:脚本语言JavaScript使用java变量
package javaScript;

import java.io.File;

import javax.script.Invocable;
import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;
import javax.script.ScriptException;
//脚本语言JavaScript使用java变量
public class ScriptUseJavaVariable {

	public static void main(String[] args) {
		
		ScriptEngineManager factory = new ScriptEngineManager();
		ScriptEngine engine = factory.getEngineByName("JavaScript");
		testScriptVarible(engine);
	}
	public static void testScriptVarible(ScriptEngine engine) {
		File file = new File("c:/example.txt");
		engine.put("f", file); //在脚本中定义一个全局变量f
		try {
			engine.eval("print('文件尺寸:'+f.length());");
		} catch (ScriptException e) {
			e.printStackTrace();
		}
}
}


第三个例子:java调用JavaScript中方法
package javaScript;

import javax.script.Invocable;
import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;
import javax.script.ScriptException;
//java调用JavaScript中方法
public class TestInvokeScriptMethod {

	public static void testInvokeScriptMethod(ScriptEngine engine) {
		String script ="function hello(name){return \"hello\"+name;}";
		try {
			engine.eval(script);
		} catch (ScriptException e) {
			e.printStackTrace();
		}
		Invocable inv = (Invocable) engine;
		String result =null;
		try {
//			调用JavaScript脚本中定义的方法,参数是不定的,第一个参数必须是方法的名字,后面是方法的参数
			result = (String) inv.invokeFunction("hello ,", "zhoujunmei");
		} catch (ScriptException e) {
			e.printStackTrace();
		} catch (NoSuchMethodException e) {
			e.printStackTrace();
		}
		
       System.out.println("返回结果:"+result);
		
	}

	public static void main(String[] args) {
		ScriptEngineManager factory = new ScriptEngineManager();
		ScriptEngine engine = factory.getEngineByName("JavaScript");
		testInvokeScriptMethod(engine);
	}

}


脚本语言实现java接口

package javaScript;

import javax.script.Invocable;
import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;
import javax.script.ScriptException;
//脚本语言实现java接口
public class TestScriptInterface {

	public static void main(String[] args) {
		ScriptEngineManager factory = new ScriptEngineManager();
		ScriptEngine engine = factory.getEngineByName("JavaScript");
		testScriptInterface(engine);
	}

	public static void testScriptInterface(ScriptEngine engine) {
		String script = "var obj = new Object();obj.run = function(){"
				+ "println('run 被调用');};";
		try {
			engine.eval(script);
		} catch (ScriptException e) {
			e.printStackTrace();
		}
		Object obj = engine.get("obj");  //获取在JavaScript中定义的变量obj同put方法相反
		Invocable inv = (Invocable) engine;
		Runnable r = inv.getInterface(obj, Runnable.class);
		//获取在JavaScript中定义的接口,并转化为实现特定的java interface对象
//		第一个参数是待转换的JavaScript中定义的对象,第二个参数是转化的目标interface的类名
//		待转换的对象一定要定义目标接口的方法,否则返回为空
		Thread th = new Thread(r);
		th.start();

	}

}


JavaScript中使用jdk中的类

package javaScript;

import javax.script.Invocable;
import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;
import javax.script.ScriptException;

public class TestUsingJDK {

	public static void main(String[] args) {
		ScriptEngineManager factory = new ScriptEngineManager();
		ScriptEngine engine = factory.getEngineByName("JavaScript");
		testUsingJDK(engine);
	}

	public static void testUsingJDK(ScriptEngine engine) {
		String script ="function doSwing(t){var f= new Packages.javax.swing.JFrame(t);" +
				"f.setSize(300,200);f.setVisible(true);}";
		try {
			engine.eval(script);
		} catch (ScriptException e) {
			e.printStackTrace();
		}
		Invocable inv = (Invocable) engine;
		String result =null;
		try {
//			调用脚本方法,参数是不定的,第一个参数必须是方法的名字,后面是方法的参数
			inv.invokeFunction("doSwing","来自JavaScript的swing窗口");
		} catch (ScriptException e) {
			e.printStackTrace();
		} catch (NoSuchMethodException e) {
			e.printStackTrace();
		}
		
	}

}

执行结果显示一个swing窗口
///////////////////////////////////////////////////////////////
以下是java结合ruby的一个小例子
jruby是一种ruby语言的解释器,提供了大量的ruby内置类,jruby无需安装,解压即可,设置jruby_home,和path(包含bin的目录)

java2.rb文件

include Java

import java.io.FileReader
import java.io.BufferedReader

filename = "example.txt"
br = BufferedReader.new(FileReader.new(filename))

s = br.readLine

print "------ ", filename, "------\n"

while s
  puts s.to_s
  s = br.readLine
end

print "------ ", filename, " end ------\n";

br.close

执行结果如下:
jdk6.0从入门到精通-----chapter18与动态语言结合_第2张图片

程序源码及jruby-bin-1.0见附件




你可能感兴趣的:(JavaScript,java,脚本,Ruby,jruby)