在写这篇随笔之前,搜索了一下“Jython + 博客园”,发现介绍Jython的文章还是比较少,仅有的那几篇大部分还是介绍怎么配置Jython。
http://www.cnblogs.com/sesamfox/articles/2313040.html,这篇文章倒是介绍得比较详细,不过说的是怎么用Jython编程的具体细节问题,我想,一般人在新学习一门语言之前不是马上去看这种语言的语法细节,而是会先去了解这种语言的特点,什么是其他语言做不到的而这种语言可以轻松做到的,也就是说相较于其他语言有什么特点。了解了这些特点之后,就相当于在看具体的细节之前对这种语言有了一个宏观的把握,虽然对于其描述的特点一开始可能不能透彻地理解,但是这些可以在具体的学习过程中一点点补充。
这篇随笔会在结合少量代码的基础上着重回答一个问题——Jython可以做什么?
一、Jython的安装
本文的主要目的是介绍Jython可以做什么,至于Jython怎么安装在这里只是提一下,http://www.jython.org上有安装包的下载和安装过程的介绍。
PS:不同的OS,安装Jython的方法不一样,需要配置的环境变量也不一样,根据自己的系统选择合适的安装包,对应的教程。
二、Jython可以做什么
1.Jython是使用java实现的Python,很显然,Python能做的,Jython也能做。
1 import os 2 3 print("Hello, Jython!!!") 4 print(os.getcwd())
在Jython的解释器下运行上面的代码,输出结果如下:
Hello, Jython!!!
C:\Users\Administrator\workspace\stackoverflow\GX1164
os是Python实现的一个模块,getcwd函数返回当前的工作目录。
可以看到,Jython的语法和CPython的语法完全一致。其中,CPython是Python的C语言实现,大部分情况下我们说Python,其实说的就是CPython。
2.Jython可以调用java语言编写的类
举个例子,我用java语言写了一个叫Decimal的类,代码如下:
1 package Overflow; 2 3 import java.math.*; 4 5 public class Decimal { 6 public void testLog(){ 7 System.out.println(Math.log(2)); 8 } 9 }
使用jar命令将这个类的字节码文件打包之后,我们就可以在Jython程序中使用这个自己定义的类,下面的测试程序显示了使用方法
1 import sys 2 sys.path.append("C:/Users/Administrator/workspace/Stack/bin/Overflow.jar") 3 4 import Overflow 5 from java.util import Date 6 7 d = Overflow.Decimal() 8 d.testLog() 9 dd = Date() 10 print(dd)
测试程序的运行结果如下:
0.6931471805599453
Sun Apr 27 10:16:00 CST 2014
这里稍微解释一下测试程序,sys是Python的另外一个模块,sys.path.append(dir)的作用是将dir这个目录加入到环境变量CLASSPATH中,对java稍微了解的人都知道,CLASSPATH这个环境变量的作用是供系统寻找类定义用的,也就是说如果你不加上这条语句,在执行import Overflow这条语句的时候,系统找不到Overflow是在哪定义的,所以会报错。
导入之后,就可以像使用Python自己定义的类一样使用自己定义的类了,语法都是一样的,在本例中,我就使用了Decimal中的testLog函数,0.69314...是log(2)以自然对数为底时的值
细心的读者可能会注意到,在import Overflow下面还有一行from java.util import Date这样一行语句,其实这行语句的作用和下面这行语句的作用是一致的
1 import java.util.Date;
只是上面这种写法是我们在写java程序的时候用到的。
从输出结果我们可以看到,在Jython中不仅可以使用自己定义的类,还可以使用java自带的丰富类库。
PS:在安装Jython之前一定要先安装好JVM,因为Jython是基于JVM的。
3.在java程序中使用Python的系统调用
下面是一个具体的例子
1 package Overflow; 2 3 import org.python.util.PythonInterpreter; 4 import org.python.core.*; 5 public class Jython { 6 public static void main(String[] args) { 7 8 PythonInterpreter interp = 9 new PythonInterpreter(); 10 System.out.println("Hello, brave new world"); 11 interp.exec("import sys"); 12 interp.exec("print sys"); 13 interp.set("a", new PyInteger(42)); 14 interp.exec("print a"); 15 interp.exec("x = 2+2"); 16 PyObject x = interp.get("x"); 17 System.out.println("x: "+x); 18 System.out.println("Goodbye, cruel world"); 19 } 20 }
请注意,这里转到了java,使用的也是java的语法,但是我们可以通过PythonInterpreter这个对象来完成对Python系统函数的调用。当然,为了使用这个对象,你需要把Jython安装目录下的Jyhton.jar加入你的java工程中。
这个例子完全借鉴于下面这篇博客
http://blog.csdn.net/zhongweijian/article/details/4742549
三、总结:
在《The Unix Philosophy》这本书中提到两点:“舍高效率而取可移植性”和“充分利用软件的杠杆效应”。
“舍高效率而取可移植性”相信大家都懂,其实“充分利用软件的杠杆效应”说的是类似的道理,就是说我们在编程的时候没必要所有的东西都自己实现,别人已经实现过的优秀代码,我们完全可以借鉴过来,这样不仅可以节省大量的时间,并且可以集中精力处理自己该处理的那部分代码,更有可能生产出高质量的代码。说到底,这两条无非是说了一个代码复用的问题。
Jython出现很好地体现了代码复用这一思想,回顾上面的内容我们可以总结出以下两点。
1.在使用Python编程时,不管是你自己实现的,还是别人实现的,还是java类库实现的,只要是.class文件,我们就可以在Python程序中直接使用,而不必再改写一遍。
2.在使用java编程时,我们可以使用Python实现的丰富类库。
综合以上两点,我们基本上可以得出一个结论:java和Python可以相互调用,这是多么强大的一个特性!