Jython可以做什么

在写这篇随笔之前,搜索了一下“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可以相互调用,这是多么强大的一个特性!

原文地址:https://www.cnblogs.com/moqiguzhu/p/3693778.html