扫一扫
分享文章到微信
扫一扫
关注官方公众号
至顶头条
Jython探索
Jython是 Python 编程语言的 100% 纯 Java 实现,它结合了 Python 及 Java 虚拟机和库的优点,并作为 Java 平台的方便补充,不过由于当初的开发者现在去开发.net下的Python了,所以造成到现在它还仍然只是和Python2.1的语法兼容,新的版本到现在也还没有出来。用人说下一个版本不再和Python兼容了,不过新的还没有出来,不好说。不过我觉得还是兼容的好,这样只要不是使用C API库的Python的程序都可以直接使用了。
最初 Jython称为 JPython,是一个十足的 Java 应用程序,它允许开发人员使用 Python 编程语言的语法和大多数特性。Jython 对Java的一种补充,它主要适用在一下几个方面::
一、 Jython入门
运行环境为windows 2000 sp4,jdk 1.4.2。
1、运行Jython
从http://sourceforge.net/projects/jython/ 下载jython_21.class。
将下载的jython-21.class
并将该文件放在 CLASSPATH
内,然后运行 java jython-21,就可以进入安装界面了。
安装完成以后,将安装目录加入到PATH中,运行jython就可以进入jython shell了,在这个shell下提示符和使用方法于Python一样,就不再过多的介绍了。
Jython在shell下的调用命令:
jython [options] [-jar jar | -c cmd | file | -] [args]
选项和参数 and arguments:
-i |
当脚本运行完成后,保持在交互状态 |
-S |
不显示提示信息 |
-Dprop=value |
设置python属性置 prop to value |
-jar jar |
运行在指定jar中的__run__.py文件。 |
-c cmd |
运行脚本字符串 |
file |
运行脚本文件 |
- |
从标准输入中读取脚本。可以使用pipe 一个文件到jython :filter file | jython - |
--help |
帮助信息 |
--version |
版本信息 |
args |
传入到程序(sys.argv[1:])的参数 |
2、在Java中调用Jython
主要是调用这个类org.python.util.PythonInterpreter的使用方法。
这里给出Jython给的一个例子:
import org.python.util.PythonInterpreter;
import org.python.core.*;
public class SimpleEmbedded {
public static void main(String []args)
throws PyException
{
PythonInterpreter interp =
new PythonInterpreter();
System.out.println("Hello, brave new world");
interp.exec("import sys");
interp.exec("print sys");
interp.set("a", new PyInteger(42));
interp.exec("print a");
interp.exec("x = 2+2");
PyObject x = interp.get("x");
System.out.println("x: "+x);
System.out.println("Goodbye, cruel world");
}
3、在Jython中操作Java
使Python能够简单的使用现有的Java库是Jython的一个目标。
例子:
在Jython的交互式的环境中,如何使用Jython建立一个Java下的随机数类的实例(java.util.Random)和使用这个实例。
C:\jython>jython
Jython 2.0 on java1.2.1
Type "copyright", "credits" or "license" for more information.
>>> from java.util import Random
>>> r = Random()
>>> r.nextInt()
-790940041
>>> for i in range(5):
... print r.nextDouble()
...
0.23347681506123852
0.8526595592189546
0.3647833839988137
0.3384865260567278
0.5514469740469587
>>>
其它内容
在这个例子中展示了在Jython环境中使用Java包和Python库的差异很小,但是仍然有一些需要注意的事情。
Importing
Jython 2.0 on java1.2.1
Type "copyright", "credits" or "license" for more information.
>>> from java.util import *
>>> Random
<jclass java.util.Random at 31702169>
>>> Hashtable
<jclass java.util.Hashtable at 7538094>
>>>
建立类的实例
可以用建立Python类实例的方法建立起Java的类实例,你必须调用带有参数“Java类名”,这些参数必须和Java类的构造函数相适应。下面将更详细的介绍关于参数的内容。
调用Java方法和函数
Java classes have both static and instance methods this makes them behave much like a cross between a Python module and class. As a user, you should rarely need to be concerned with this difference.
调用Java的方法和函数就象调用这些方法的Python副本一样。方法的输入参数类型和返回值的类型被自动强制转换。
这个表显示Python对象作为方法的输入参数如何转换为java对象的。注意如果java.lang.Object 输入参数预期为一个String时,在置换时有问题。
Java方法的参数类型 |
对应的Python类型 |
char |
String (长度必须为1) |
boolean |
Integer (true =非零) |
byte, short, int, long |
Integer |
float, double |
Float |
java.lang.String, |
String |
java.lang.Class |
Class or JavaClass (如果类为java类的子类不允许继承多个java类,只允许继承一个java类) |
Foo[] |
Array (只能是指定类或这子类的对象) |
java.lang.Object |
String->java.lang.String, 其它的不变 |
org.python.core.PyObject |
不变 |
Foo |
Instance->Foo (Instance为Foo的子类的实例); |
Java方法返回值也同样会被转换为响应的Python对象。
Java方法的返回值类型 |
返回的Python类型 |
char |
String (长度为1) |
boolean |
Integer (true = 1, false = 0) |
byte, short, int, long |
Integer |
float, double |
Float |
java.lang.String |
String |
java.lang.Class |
JavaClass作为 Java class |
Foo[] |
Array (包括Foo的对象和Foo的子类的对象) |
org.python.core.PyObject (or subclass) |
不变的 |
Foo |
JavaInstance 作为javaClass Foo |
Overloaded Java Method 的处理
Foo有两个, "void foo(int x); void foo(byte x);".调用第二个方法可以用下面的方法:
from java.lang import Byte
foo(Byte(10))
应该不会有更好的方法了。
名称和Python关键字冲突的处理
由于Java关键字和Python关键字不同,所以有很多的java类名,方法名与Python关键字有冲突。这样就必须清楚的区分不通的名称。在有些时候可以写成这样:
java.lang.System.out.print("hi")
或者
java.lang.Runtime.getRuntime().exec(cmd)
在非常少的时候,会出现冲突不能被Python解决,这样就需要在保留字的后面加上一个下滑线,例如: print_ 。
如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。
现场直击|2021世界人工智能大会
直击5G创新地带,就在2021MWC上海
5G已至 转型当时——服务提供商如何把握转型的绝佳时机
寻找自己的Flag
华为开发者大会2020(Cloud)- 科技行者