分享
 
 
 

Jython探索(1)

王朝java/jsp·作者佚名  2006-01-09
窄屏简体版  字體: |||超大  

Jython探索

Jython是 Python 编程语言的 100% 纯 Java 实现,它结合了 Python 及 Java 虚拟机和库的优点,并作为 Java 平台的方便补充,不过由于当初的开发者现在去开发.net下的Python了,所以造成到现在它还仍然只是和Python2.1的语法兼容,新的版本到现在也还没有出来。用人说下一个版本不再和Python兼容了,不过新的还没有出来,不好说。不过我觉得还是兼容的好,这样只要不是使用C API库的Python的程序都可以直接使用了。

最初 Jython称为 JPython,是一个十足的 Java 应用程序,它允许开发人员使用 Python 编程语言的语法和大多数特性。Jython 对Java的一种补充,它主要适用在一下几个方面::

内置脚本,java程序员可以在系统中加入Jython库,这样最终用户可以在他们的应用程序中通过简单或者复杂的脚本扩充功能了。

交互的试验环境,Jython提供了交互式的解释器接口,这样就可以和java 包或者正在运行的java程序相结合。程序员可以适用Jython实验和调试他的系统了,这使某些开发更简单,而且它在自动测试框架中特别有用。

高效的应用开发。Python在相同情况下比java语言短2-10倍,开发人员喜欢 Python 的语法和这种语言所带来的感觉;他们发现它是开发和维护 Java 应用程序的生产率更高得多的方法。Python和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,

byte[], char[]

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的子类的实例);

JavaInstance -> Foo (JavaInstance为Foo或者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_ 。

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有