Jython
Jython
概述
Jython是Python编程语言的JVM实现。 它旨在在Java平台上运行。 Jython程序可以导入和使用任何Java类。 就像Java一样,Jython程序编译为bytecode 。 其中一个主要优点是用Python设计的用户界面可以使用AWT , Swing或SWT Package GUI元素。
Jython以JPython开头,后来被重命名,紧跟着Guido Van Rossum创建的标准Python实现CPython 。 Jython由Jim Hugunin于1997年创立。Jython 2.0于1999年发布。从那时起,Jython 2.x版本对应于等效的CPython版本。 2015年5月发布的Jython 2.7.0对应于CPython 2.7。 Jython 3.x的开发正在进行中。
Python和Java之间的区别
以下是Python和Java之间的区别 -
Python是一种动态类型语言。 因此,不需要变量的类型声明。 另一方面,Java是一种静态类型语言,这意味着变量的类型声明是强制性的,不能更改。
Python只有未经检查的异常,而Java同时检查和取消选中异常。
Python使用缩进进行作用域,而Java使用匹配的大括号。
由于Python是一种基于解释器的语言,因此它没有单独的编译步骤。 但是,Java程序需要编译为字节码,然后由JVM执行。
Python支持多重继承,但在Java中,多重继承是不可能的。 然而,它具有接口的实现。
与Java相比,Python具有更丰富的内置数据结构(列表,dicts,元组,一切都是对象)。
Python和Jython之间的区别
以下是Python和Jython之间的区别 -
Python的参考实现,称为CPython,是用C语言编写的。 另一方面,Jython完全用Java编写,是一个JVM实现。
标准Python可在多个平台上使用。 Jython适用于安装了JVM的任何平台。
标准Python代码编译为.pyc文件,而Jython程序编译为.class文件。
Python扩展可以用C语言编写。 Jython的扩展是用Java编写的。
Jython本质上是真正的多线程。 然而,Python使用Global Interpreter Lock (GIL)机制来实现此目的。
两种实现都有不同的垃圾收集机制。
Jython - Importing Java Libraries
Jython最重要的特性之一是它能够在Python程序中导入Java类。 我们可以在Jython中导入任何java包或类,就像在Java程序中一样。 以下示例显示如何在Python(Jython)脚本中导入java.util包以声明Date类的对象。
from java.util import Date
d = Date()
print d
Java库中的以下包经常在Jython程序中导入,主要是因为标准Python库没有它们的等价物或者不那么好。
Servlets
JMS
J2EE
Javadoc
Swing被认为优于其他GUI工具包
可以在Jython脚本中导入任何Java包。 这里,以下java程序在名为foo的包中存储和编译。
package foo;
public class HelloWorld {
public void hello() {
System.out.println("Hello World!");
}
public void hello(String name) {
System.out.printf("Hello %s!", name);
}
}
此HelloWorld.class在以下Jython脚本中导入。 可以从Jython脚本importex.py调用importex.py 。
from foo import HelloWorld
h = HelloWorld()
h.hello()
h.hello("IoWiki")
测试类型转换的安全性
在Import Java Libraries , Jython将Java的数据结构类型进行了抽象,转成python对应的数据结构类型。
以下不同的add函数返回值也不同,我们要观察在python调用不同的add的时候返回值类型是什么。
package foo;
import java.util.HashMap;
import java.util.Map;
public class HelloWorld {
public static int add(int a,int b){
return a+b;
}
public static String add(String a,String b){
return a+b;
}
public static Map<Integer, Float> add(int a, float b){
Map<Integer,Float> map=new HashMap<>();
map.put(a,b);
return map;
}
public static void main(String[] args) {
System.out.println(add(1,2));
}
}
from foo import HelloWorld
h = HelloWorld()
a = h.add(1,0.5)
print(type(a)) #<type 'java.util.HashMap'>
a = h.add(1,1)
print(type(a)) #<type 'int'>
a = h.add("1","1")
print(type(a)) #<type 'unicode'>
除了Python的内置数据类型之外,Jython还可以通过导入java.util package来使用Java集合类。 以下代码描述了下面给出的类 -
- 带有add()的Java ArrayList对象
- remove()
- ArrayList类的get()和set()方法。
import java.util.ArrayList as ArrayList
arr = ArrayList()
arr.add(10)
arr.add(20)
print "ArrayList:",arr
arr.remove(10) #remove 10 from arraylist
arr.add(0,5) #add 5 at 0th index
print "ArrayList:",arr
print "element at index 1:",arr.get(1) #retrieve item at index 1
arr.set(0,100) #set item at 0th index to 100
print "ArrayList:",arr
上面的Jython脚本产生以下输出 -
ArrayList: [10, 20]
ArrayList: [5, 20]
element at index 1: 20
ArrayList: [100, 20]
Jython还实现了Jarray Object ,它允许在Python中构建Java数组。 为了使用jarray,只需在Jython中定义一个序列类型,并将其与序列中包含的对象类型一起传递给jarrayobject。 jarray中的所有值必须是相同的类型。
下表显示了与jarray一起使用的字符类型代码。
角色类型代码 | 对应的Java类型 |
---|---|
Z | Boolean |
C | char |
B | byte |
H | short |
I | int |
L | long |
F | float |
D | double |
以下示例显示了jarray的构造。
my_seq = (1,2,3,4,5)
from jarray import array
arr1 = array(my_seq,'i')
print arr1
myStr = "Hello Jython"
arr2 = array(myStr,'c')
print arr2
这里my_seq被定义为整数元组。 它被转换为Jarray arr1。 第二个例子显示Jarray arr2是从mySttr string序列构造的。 上面脚本jarray.py的输出如下 -
array('i', [1, 2, 3, 4, 5])
array('c', 'Hello Jython')