动态语言即解释性语言,即脚本语言。是一种在执行期间才去发现数据类型的编程语言。主要的动态语言如PHP,perl,Ruby,Python,SmallTalk,JavaScript,VBScript等等
以下主要是java与JavaScript结合的例子
jdk6.0中的bin文件夹下有一个jrunscript命令,是一个脚本解释程序,用于测试脚本语言的正确与否,默认为JavaScript
在cmd下输入jrunscript,回车
即进入js>,输入println("hello"),会显示hello
整个ch18的项目结构:
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
执行结果如下:
程序源码及jruby-bin-1.0见附件