[Jython]第1部分:轻轻松松编写Java 程序

最近由于需要使用脚本做系统配置,因此想到用Jython。以下随笔大部分是转载,结合个人使用体验。

  

关于本教程

本教程介绍哪些内容?

这个两部分的教程将介绍 Jython 脚本语言,并提供开始开发基于 Jython 的应用程序所需的足够知识。Jython 是 Python 的一种实现,已无缝集成到 Java 平台中。Python 主要在 UNIX 环境中使用,是一种强大的面向对象的脚本语言。

Jython 非常有用,因为它运行于 JVM 上,且具有成熟脚本语言所具有的高生产率。与 Python 程序不同,Jython 程序可以运行在任何支持 JVM 的环境中。现在这意味着可在大多数计算系统上使用,包括 Microsoft Windows、Mac OS、大多数 UNIX 变体(包括所有 Linux 系统)和所有的 IBM 系统。

本教程采用渐进步骤介绍 Jython。本文(即本教程的前半部分)将介绍使用 Jython 的概念和编程基础知识,包括访问选项和文件编译、语法和数据类型、程序结构、过程语句和函数。 本教程的第 2 部分将开始对采用 Jython 的面向对象编程进行概念性介绍。之后,我们将进行更具体的讨论,包括类语句、属性和方法、抽象类和运算符重载。这个高级讨论还包括调试、字符串处理、文件 I/O 和 Jython 中的 Java 支持。本教程结束时,将一步步演示如何用 Jython 构建一个可以工作的 GUI 应用程序。

在本教程的开始部分,示例代码非常简单,但在第 2 部分结束时,您将会完全掌握函数、类和程序。本教程还包括一组附录,详细介绍了 Jython 的内部工作原理。

 

 

我是否应该学习本教程?

本教程面向各个层次的软件开发人员,从偶尔的涉足者到专业人员。但它特别适合那些希望利用脚本语言所具有的高生产率优势的 Java 开发人员。那些希望轻松进入 Java 开发世界的 Visual Basic 和 C++/C# 程序员,也可以学习本教程。

总之,我们将讨论 Jython 脚本编程的以下方面:

第 1 部分

下载和安装
对 Jython 的概念性介绍
使用命令行与使用源文件
语法和数据类型
程序结构
过程语句
函数
第 2 部分

用 Jython 进行面向对象编程
调试
Java 支持
字符串处理
文件 IO
用 Jython 构建 GUI 应用程序
要从本讨论中获益,应该至少熟悉一门过程编程语言和计算机编程的基本概念,包括命令行处理。要完全利用 Jython 的特性,还应该熟悉面向对象编程的基本概念。如果具有 Java 平台的实际知识,也是很有帮助的(尽管本教程不要求具备这些知识),因为 Jython 运行在该平台上。

注意,本教程面向 Windows 系统。所有命令示例均采用 Windows 语法。在大多数情况下,类似命令在 UNIX 系统上执行相同的功能,尽管不会演示这些命令。

 

工具、代码和安装要求

要学完本教程,必须在开发系统上安装 Jython 2.5.2(jython_installer-2.5.2.jar)或更高版本。开发系统可以是任何 ASCII 文本编辑器(如 Windows Notepad)和命令提示符的组合。本教程包括获得并安装 Jython 的详细说明。

要使用 Jython,还必须在系统上安装 Java 运行时环境(Java Runtime Environment,JRE)。建议采用能得到的最新的 JRE(编写本文时为 1.6.0版)。如果打算从浏览器使用 Jython(即作为 applet),浏览器必须可以使用 JRE 1.1。请参阅参考资料下载 Java 开发工具包 (JDK) 的最新版本。

本教程中的所有代码示例都已在 Windows 2000 的 Sun Java 1.6.0 JRE 上运行的 Jython 上进行了测试。无须在其他操作系统上更改任何类似配置,这些例子都能正常工作。

 

入门

安装说明

本节将逐步介绍在开发系统上下载、安装和验证 Jython 的每个步骤。

 

下载 Jython

可以从 Jython 主页下载 Jython 2.5.2。您会发现下载页面上的下载说明非常容易。

正如前面所提到的,本教程基于当前稳定的 Jython 级别,即版本 2.5.2。可以从 Jython 主页获得更高级的开发级别。

 

 

安装 Jython

安装 Jython 很简单:只须执行从 Jython 主页下载的类文件(jython_installer-2.5.2.jar)即可。假设已安装了 JRE 且已将类文件下载到当前目录中(下面的例子中是 C:\),下列命令将安装 Jython(注意,<java_home> 是安装 JRE 的目录):

C:\><java_home>\bin\java jython-21
请按照安装应用程序的提示执行。建议选择默认值,并选择 D:\jython2.5.2 作为目标目录。

 

 

验证安装

要验证是否安装了 Jython,请输入命令:

D:\>dir D:\Jython2.5.2

命令执行后的结果应与下面的清单类似:

 d:\jython2.5.2 的目录

2012-01-13  09:29    <DIR>          .
2012-01-13  09:29    <DIR>          ..
2011-03-02  23:11             2,734 ACKNOWLEDGMENTS
2012-01-13  09:19    <DIR>          bin
2011-03-02  23:11            49,163 build.xml
2012-01-13  09:29    <DIR>          cachedir
2011-03-02  23:11             6,355 CoreExposed.includes
2012-01-13  09:19    <DIR>          Demo
2012-01-13  09:19    <DIR>          Doc
2012-01-13  09:19    <DIR>          extlibs
2012-01-13  09:19    <DIR>          grammar
2012-01-13  09:19             7,768 jython.bat
2011-03-02  23:12         8,297,793 jython.jar
2012-01-13  09:29    <DIR>          Lib
2011-03-02  23:11             9,805 LICENSE.txt
2011-03-02  23:10            11,358 LICENSE_Apache.txt
2011-03-02  23:12            13,741 LICENSE_CPython.txt
2011-03-02  23:11            66,117 NEWS
2011-03-02  23:11             1,989 README.txt
2011-03-02  23:11             3,193 registry
2012-01-13  09:19    <DIR>          src
2012-01-13  09:19    <DIR>          tests
              11 个文件      8,470,016 字节
              11 个目录 25,511,518,208 可用字节


测试运行

最后的步骤是确保配置了 Jython。要运行 Jython,请输入下列命令启动 Jython:

D:\jython2.5.2>jython

执行该命令后应该产生一个与下面类似的介绍:

Jython 2.5.2 (Release_2_5_2:7206, Mar 2 2011, 23:12:06)
[Java HotSpot(TM) Client VM (Sun Microsystems Inc.)] on java1.6.0_24
Type "help", "copyright", "credits" or "license" for more information.
>>>

最后退出 Jython。在 Jython 提示符下,输入下列命令:

>>> import sys; sys.exit()

或者,可以按 Ctrl+C 两次。

 

 

我们的生活更便捷

在结束“入门”一节之前,还应了解一件事:不必通过将 Jython 命令路径 (<d>:\jython2.5.2) 添加到 PATH 变量来指定该路径,现在只需在该路径(<d>:\jython2.5.2) 命令提示符下键入 jython 即可。

 

 

Jython 的基本概念和优点

什么是 Jython?

上文提到,Jython 是用 Java 语言编写的 Python 实现,并与 Java 平台集成在一起。Python 是一种脚本语言,经常在基于 UNIX 的系统(包括 Linux)中使用。Python 由 Guido van Rossum 发明并在1991年被引入到开发人员社区中。Jython 当前支持级别 2.5 的 Python 语法。

 

 

什么是脚本语言?

与 Java 编程语言不同,Jython 是一种脚本语言。脚本语言通常具有如下特点:

1、很容易学习和编码
2、意图明确且简练,但功能强大
3、具有最小的必需结构来创建一个运行的“程序”
4、支持交互式(一次一个命令)执行
5、不要求执行编译步骤
6、支持反射式程序设计
7、支持函数式程序设计
8、支持源代码(即 eval 函数)的动态执行
9、运行外部程序

一般而言,可以说脚本语言对程序员效率的贡献是建立在机器效率和性能之上的。与编程语言(如 Java 语言)相比,Jython 易于学习且编码效率很高。

Jython 还可以被描述为轻巧灵活的语言。这种语言通常被认为是能执行各种各样的任务,在解决许多不同类型的问题时很有用,易于使用且功能强大、意图明确。它们也是理想的快速原型开发语言。

 

 

 Jython 的优点

与基于 C 的兄弟 Python 一样,Jython 大多数是在小场合中用来开发小型程序和脚本;它有许多特性,允许在几分钟内创建简单而实用的程序。但这并不意味着 Jython 不能用于大规模的程序设计。实际上,Jython 支持复杂的打包方案,类似于 Java 语言。依赖其面向对象的特点,Jython 具有高度的可扩展性,并为有效的软件工程提供了最新结构。

Jython 与 Java 语言相似,但不像其他一些脚本编程语言,如 Perl 和 Rexx,它从一开始就设计成一种面向对象的语言。因此,它提供易于理解的强大的面向对象编程 (OOP) 特性。

Jython 最大的优点之一是运行于任何 JVM 上,因此采用 Jython 编码的应用程序几乎可以在任何计算系统上运行。

 


 

Jython 和 Java 平台

Jython 内置在 Java 平台中。从平台的角度看,Jython 运行时仅仅是另一个 Java 类。如果您深入了解 JYTHON.BAT 文件,这一点就非常明显,该文件启动 Java 运行时,而将 Jython 解释器作为其主类(main class),如下所示:

@echo off
rem This file generated by Jython installer
rem
JAVA_HOME=<java_home>
rem
rem collect all arguments into %ARGS%
set ARGS=
:loop
if [%1] == [] goto end
     set ARGS=%ARGS% %1
     shift
     goto loop
:end

%JAVA_HOME%\bin\java.exe
    -Dpython.home=C:\jython-2.1
    -cp "C:\jython-2.1\jython.jar;%CLASSPATH%"
    org.python.util.jython %ARGS%
           

一切都是解释型的

Jython 在本质上是一种解释型语言。 Jython 中没有预编译步骤(而 Java 和 C++ 中有这一步),所以每次运行 Jython 代码时,都会进行重新解释。同样,代码可以快速进行更改和测试。Jython 代码还可以交互输入(即一次一行)。此外,您可以动态构造 Jython 代码(即作为字符串)并直接执行。这样就可以灵活地进行编码,而这一点在 Java 编码中是不可能的。

Jython 解释器将 Jython 源代码转换为内部形式,以便更有效地进行处理。它在检查语法的第一次传递期间执行该项工作。一旦该传递完成,则内部化的源文件就被解释了。Jython 还在磁盘上缓存这种内部化形式。在 Java 类文件中,对于 Jython 模块 <name>.py,缓存文件将是 <name>$py.class。

解释执行方式也确实或多或少有些缺点。例如,使用未定义的变量不是编译器错误,因此,只有在使用变量的语句执行时才能被检测出来。虽然这一点与编译型语言相比可能是个缺点,但您可以编辑程序,然后立即执行并遇到错误(如果存在的话),这一事实会弥补这一缺点。一个简单的测试-调试步骤所花费的时间和重复进行编辑-编译步骤来删除错误所费的时间大致相同。

关于性能

由于 Jython 是解释型语言,所以它可能比编译型语言(如 Java)慢。在大多数应用程序(如脚本和 GUI)中,这一速度差别几乎注意不到。在大多数情况下,Jython 所增加的设计和编码灵活性弥补了任何小的性能损失。

由于 Jython 代码被动态转换为 Java 字节码,所以最新的对 Java 平台(如 JIT 和 Sun 的 HotSpot JVM)的功能增强也可以消除许多性能问题。

 

 

使用 Jython

将 Jython 用作命令行解释器

使用 Jython 最容易的方式之一是用作命令行解释器。在这种方式下,一次输入一行代码行,并可以立即看到结果。这是学习 Jython 并用最小开销尝试新编码技术的一种理想方式。

我们从简要介绍 Jython 交互会话开始。在 ">>>" 或 "..." 提示符后输入下列命令:

C:\>c:\jython-2.1\jython

应该接收到类似于下面的输出:

Jython 2.1 on java1.4.1_01 (JIT: null)
Type "copyright", "credits" or "license" for more information.
>>> 1 + 2
3
>>> "Hello" + "Goodbye"
'HelloGoodbye'
>>> def fac(x):
...  if x <= 1: return 1
...  return long(x) * fac(x-1)
...
>>> fac(3)
6L
>>> fac(100)
93326215443944152681699238856266700490715968264381621468592963895217599
99322991560894146397615651828625369792082722375825118521091686400000000
0000000000000000L
>>> import sys; sys.exit(0)
C:\>

 

Notice:如果因字符编码问题导致命令不可识别,可调整命令行的字符编码,方法如下

 

  1. chcp 65001  就是换成UTF-8代码页   
  2. chcp 936 可以换回默认的GBK   
  3. chcp 437 是美国英语   

 


通过这个例子,可以看到输入会很快得到执行。而输入包括简单表达式和更复杂的操作,如函数定义(即 fac 函数)。已定义的值和函数可以立即使用。还应注意,Jython 通过 long 类型支持非常大的整数。

注意上例中 fac 函数的缩进非常重要。在本教程的后面,您将了解有关该要求的更多信息(请参见块)。

 

 

通过源文件使用 Jython

如果 Jython 只接受命令行输入,那它的用处就不太大;因此,它还允许接受源文件。Jython 源文件以扩展名 .py 结束。Jython 文件必须包含一系列 Jython 语句。表达式,如 1 + 2,并不是有效的语句(虽然执行,但不生成显示的输出)。

要显示表达式,必须将其放在 print 语句中。因此,上一节的序列可以编码在源文件中,如下所示:

print 1 + 2
print "Hello" + "Goodbye"
def fac(x):
  if x <= 1: return 1
  return long(x) * fac(x-1)
print fac(3)
print fac(100)

上述代码产生的输出与 将 Jython 用作命令行解释器 例子中的相同。而实际上,这些语句可能已采用交互方式输入了(在 fac 函数后另加了一个空行),并产生相同的结果。

 

 

print 语句

如前一屏所示,我们使用 print 语句来输出表达式。该语句采用下列形式:

print expression {, expression}... {,}

-- or --

print

上述 print 语句还可以包含由逗号分隔的表达式的列表。表达式输出时,会自动在两个表达式之间添加一个空格。因此, print "Hello", "Goodbye" 输出 Hello Goodbye

如果 print 语句以逗号结束,则不输出换行。print 行本身输出一个换行。

 

 

“Hello World”示例

在 Jython 中,典型的示例程序――Hello World――是一个单行文件(名称为 hello.py),如下所示:

print "Hello World!"

要运行该程序,应输入命令:C:\>c:\jython-2.1\jython hello.py

注意必须要有 .py 扩展名,否则将出现 "file not found" 错误。jython 命令包含几个选项。要获得更多信息,请参见 Jython 主页(在参考资料中)。

 

 

Jython 源文件是模块

Jython 源文件可以包含一系列要执行的语句。它们还可以包含函数(请参见 Jython 函数 )和类定义(本教程的第 2 部分将讨论有关类定义的更多内容)。 实际上,Jython 源文件可以是模块(稍后将在 模块和包 中介绍更多内容),而模块不能直接使用,要由其他程序导入。单个源文件可以扮演两种角色。请考虑上一屏中该文件的变体,如下所示:

def fac(x):
     if x <= 1: return 1
     return long(x) * fac(x-1)

if __name__ == "__main__":
     print 1 + 2
     print "Hello" + "Goodbye"
     print fac(3)
     print fac(100)

同样,运行该文件会产生与以前相同的结果。但如果文件被导入到另一个只希望重用fac 函数的程序中,则 if (请参见 if 语句)测试条件下的任何一个语句都不执行。

还要注意,每个模块都有一个名称,从命令行直接执行的名称为 "__main__"。该特性可用于为每个模块创建测试案例。

 

编译 Jython

Jython 源文件可以被编译成 Java 源代码(它自动编译成字节码)以生成独立的类或 Java Archive Files (JAR) 文件。要创建直接从 Java 平台调用的 Jython 代码(比如创建 applet 或 servlet 时),必须执行该步骤。这对于提供 Jython 应用程序而不用发布 Jython 源代码也很有用。

通过使用 jythonc 命令(即假设您在 Java CLASSPATH 中有必需的 Jython JAR),Jython 可以被编译成可以直接在任何 JVM 上运行的纯 Java 类。有关使用 jythonc 的更多信息,请参见 Jython 主页(参考资料)。

 

 

编译示例

我们将 factor.py 文件(请参见 参考资料)作为独立的示例程序。要编译该程序,请使用命令:

c:\>c:\jython-2.1\jythonc factor.py

如果没有出现错误,将创建 Java 类文件 factor.classfactor$_PyInner.class 。您将在 参考资料 中找到实际生成的 Java 源代码。要运行该(现在是 Java)应用程序,请使用命令:

c:\><java_home>\bin\java -cp .;c:\jython-2.1\jython.jar factor

最终输出与下列内容类似:

factor running...
For -1 result = Exception - only positive integers supported: -1
For 0 result = 1
For 1 result = 1
For 10 result = 3628800
For 100 result =
93326215443944152681699238856266700490715968264381621468592963895217599
99322991560894146397615651828625369792082722375825118521091686400000000
0000000000000000
For 1000 result = 4023872600770937735437024
     ... many digits removed ...
00000000000000000000

注意,这个输出与直接使用 factor.py 程序生成的输出相同。

 

posted @ 2012-01-05 13:54  芝麻  阅读(17942)  评论(0编辑  收藏  举报