Jython

Jython

概述

Jython是Python编程语言的JVM实现。 它旨在在Java平台上运行。 Jython程序可以导入和使用任何Java类。 就像Java一样,Jython程序编译为bytecode 。 其中一个主要优点是用Python设计的用户界面可以使用AWTSwingSWT 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类型
ZBoolean
Cchar
Bbyte
Hshort
Iint
Llong
Ffloat
Ddouble

以下示例显示了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')
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值