`

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

阅读更多
动态语言即解释性语言,即脚本语言。是一种在执行期间才去发现数据类型的编程语言。主要的动态语言如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见附件




  • 大小: 26.4 KB
  • 大小: 35.6 KB
分享到:
评论

相关推荐

    jdk6.0从入门到精通-----chapter17动态编程

    《JDK 6.0从入门到精通——Chapter 17 动态编程》 在Java编程领域,JDK 6.0版本引入了许多新特性,其中动态编程是提升开发效率和灵活性的重要方面。本章将深入探讨动态编程的概念、用途以及如何在JDK 6.0中利用这些...

    jdk6.0从入门到精通-----chapter7线程

    《JDK 6.0线程入门到精通——Chapter 7》 在Java开发中,线程是程序执行的最小单元,它使得一个程序能够同时处理多个任务,从而提高了程序的效率和响应性。在JDK 6.0中,线程的管理和使用有了更加完善的特性,对于...

    jdk6.0从入门到精通-----chapter5网络编程 新I/O(含源码下载)

    在Java编程领域,JDK(Java Development Kit)是开发和运行Java应用程序的...总的来说,"JDK6.0从入门到精通-----chapter5网络编程 新I/O"是一个极好的学习资源,无论你是初学者还是有经验的开发者,都能从中获益良多。

    (源码下载)jdk6.0从入门到精通-----chapter2--输入输出,克隆对象

    标题 "(源码下载)jdk6.0从入门到精通-----chapter2--输入输出,克隆对象" 提供了我们要探讨的主题,即Java中的输入输出流(I/O Stream)和对象克隆。在这个章节中,我们将深入理解这两个关键概念。 **输入输出流...

    jdk6.0从入门到精通-----chapter8并发多线程(1)(源码下载)

    本章“jdk6.0从入门到精通-----chapter8并发多线程(1)”着重讲解了Java 6中关于多线程的基本知识和实践技巧。通过源码下载,读者可以更直观地理解多线程的实现方式。 首先,我们要理解什么是多线程。在单线程环境...

    jdk6.0从入门到精通-----chapter4--文件目录操作

    在Java编程语言中,JDK(Java Development Kit)是核心组件,它包含了开发和运行Java应用程序所需的工具和Java运行环境。本章节将深入探讨JDK 6.0中的文件和目录操作,这对于任何Java开发者来说都是必备的知识点。在...

    jdk6.0从入门到精通-----chapter16反射机制-spring AOP

    在Java编程领域,JDK6.0是一个重要的版本,它为开发者提供了丰富的特性和改进。本章我们将深入探讨“反射机制”以及如何结合Spring AOP(面向切面编程)进行应用。反射是Java中的一种强大工具,允许程序在运行时检查...

    jdk 6.0 jdk-6u10-rc2-bin-b32-windows-i586-p-12_sep_2008(微信开发平台开发JDK)

    微信开发平台开发工具 JDK jdk 6.0 jdk-6u10-rc2-bin-b32-windows-i586-p-12_sep_2008

    官方JDK6.0中文版

    - **增强的动态代理:** JDK 6.0引入了改进的动态代理机制,允许开发者创建能够处理多个接口的代理类,提高了代码的灵活性和可维护性。 - **Swing组件的增强:** Swing库在JDK 6.0中得到了加强,包括新的布局管理器...

    jdk-7u80-windows-x64安装包

    jdk-7u80-windows-x64安装包 jdk-7u80-windows-x64安装包 jdk-7u80-windows-x64安装包 jdk-7u80-windows-x64安装包 jdk-7u80-windows-x64安装包 jdk-7u80-windows-x64安装包 jdk-7u80-windows-x64安装包 jdk-7u80-...

    JDK6.0+中文文档-lytim24.part1.rar

    java6.0文档chm版,分成三部分,分别为JDK6.0+中文文档-lytim24.part1.rar、JDK6.0+中文文档-lytim24.part2.rar、JDK6.0+中文文档-lytim24.part3.rar

    开发工具 jdk-8u121-windows-i586

    开发工具 jdk-8u121-windows-i586开发工具 jdk-8u121-windows-i586开发工具 jdk-8u121-windows-i586开发工具 jdk-8u121-windows-i586开发工具 jdk-8u121-windows-i586开发工具 jdk-8u121-windows-i586开发工具 jdk-8...

    JDK6.0u10b32-windows-

    这个是安装开发工具java jdk 有很多用途

    java-jdk1.8-8u361-all-jdk-win-linux

    java-jdk1.8-8u361-all-jdk-win-linux 该压缩包中包含jdk1.8-8u361下windows版本和linux版本,其包含快速安装包和对应的jdk压缩包版本,具体内容如下: jdk-8u361-linux-aarch64.rpm jdk-8u361-linux-i586.rpm jdk-8...

    jdk-8u131-windows-x64

    jdk-8u131-windows-x64jdk-8u131-windows-x64jdk-8u131-windows-x64jdk-8u131-windows-x64jdk-8u131-windows-x64jdk-8u131-windows-x64jdk-8u131-windows-x64jdk-8u131-windows-x64jdk-8u131-windows-x64jdk-8u131-...

    JDK 6.0.zip

    5. **动态语言支持**:JDK 6开始引入了JSR 223,即Scripting for the Java Platform,允许在Java环境中使用多种脚本语言。 6. **数据库连接池**:JDBC 4.0引入了连接池的自动管理,简化了数据库连接的管理。 7. **...

    jdk-8u311-windows-x64.exe

    jdk-8u311-windows-x64.exe jdk-8u311-windows-x64.exe.zip jdk-8u311-windows-x64.exe jdk-8u311-windows-x64.exe.zip jdk-8u311-windows-x64.exe jdk-8u311-windows-x64.exe.zip jdk-8u311-windows-x64.exe jdk-8u...

    jdk-8u60-windows-i586-JDK1.8-32位

    jdk-8u60-windows-i586 jdk-8u60-windows-i586 jdk-8u60-windows-i586 jdk-8u60-windows-i586 jdk-8u60-windows-i586

    深入jdk6.0源码

    总而言之,《深入JDK6.0源码》是一个全面解析Java 6开发工具包的资源,它不仅包含Java语言的基本要素,还涵盖了从开发环境配置到高级特性的深入探讨,对于提升Java开发者的技术水平具有重要的指导价值。通过学习,...

Global site tag (gtag.js) - Google Analytics