如何将Jython类型转换为Java类型

开发 后端
有时会需要在 Jython 中创建纯 Java 对象,便需要将Jython类型转换。本文讲述了如何转换Jython类型到Java类型的方法。

Jython类型映射 Java类型

有时会需要在 Jython 中创建纯 Java 对象(例如,在需要创建跨网络发送给基于 Java 的服务器的对象、或者在需要向一个类型敏感的 Java 服务(如带有 Swing 表格单元值的服务)传递对象时)。要将 Jython类型转换为 Java类型(以及相反),使用下面例子中的函数:

def mapMapFromJava (map):     
    """ Convert a Map to a Dictionary. """    
    result = {}     
    iter = map.keySet().iterator()     
    while iter.hasNext():     
        key = iter.next()     
        result[mapFromJava(key)] = mapFromJava(map.get(key))     
    return result     
    
def mapCollectionFromJava (coll):     
    """ Convert a Collection to a List. """    
    result = []     
    iter = coll.iterator();     
    while iter.hasNext():     
        result.append(mapFromJava(iter.next()))     
    return result     
    
def mapFromJava (object):     
    """ Convert a Java type to a Jython type. """    
    if object is Nonereturn object     
    if   isinstance(object, util.Map):             
        result = mapMapFromJava(object)     
    elif isinstance(object, util.Collection):      
        result = mapCollectionFromJava(object)     
    else:                                          
        result = object     
    return result     
    
def mapSeqToJava (seq):     
    """ Convert a sequence to a Java ArrayList. """    
    result = util.ArrayList(len(seq))     
    for e in seq:     
        result.add(mapToJava(e));     
    return result     
    
def mapDictToJava (dict):     
    """ Convert a Dictionary to a Java HashMap. """    
    result = util.HashMap()     
    for key, value in dict.items():     
        result.put(mapToJava(key), mapToJava(value))     
    return result     
    
def mapToJava (object):     
    """ 将Jython类型转换为Java类型 """    
    if object is Nonereturn object     
    t = type(object)     
    if   t == TupleType or t == ListType:       
        result = mapSeqToJava(object)     
    elif t == DictType:       
        result = mapDictToJava(object)     
    else:                     
        result = object     
    return result     
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.
  • 30.
  • 31.
  • 32.
  • 33.
  • 34.
  • 35.
  • 36.
  • 37.
  • 38.
  • 39.
  • 40.
  • 41.
  • 42.
  • 43.
  • 44.
  • 45.
  • 46.
  • 47.
  • 48.
  • 49.
  • 50.
  • 51.
  • 52.
  • 53.

在使用了 mapToJava 后,这些类型可以写为java.io.ObjectOutputStream。从 java.io.ObjectInputStream 读出一个对象后,可以用 mapFromJava 将对象转换回 Jython 类型。

注意这些方法支持有限的、但是广泛使用的一组内置 Jython类型。Jython 自动转换类似值的类型,如数字和字符串。不支持用户定义的类。

映射Java类型

继续这个例子,下面显示了继续使用上一屏讨论的映射函数的情况:

data = (1,2,3, [1,2,3], [c for c in "Hello!"], "Hello!", {1:'one'2:'two'})  
print "data:", data  
toJava = mapToJava(data)  
print "toJava:", toJava  
fromJava = mapFromJava(toJava)  
print "fromJava:", fromJava  
 
print 
 
print "type(%s)=%s" % ("data", type(data))  
print "type(%s)=%s" % ("toJava", type(toJava))  
print "type(%s)=%s" % ("fromJava", type(fromJava))  
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.

打印:

data: (123, [123], ['H''e''l''l''o''!'], 'Hello!', \  
{2'two'1'one'})  
toJava: [123, [123], [H, e, l, l, o, !], Hello!, {2=two, 1=one}]  
fromJava: [123, [123], ['H''e''l''l''o''!'], 'Hello!', \  
{2'two'1'one'}]  
 
type(data)=org.python.core.PyTuple  
type(toJava)=org.python.core.PyJavaInstance  
type(fromJava)=org.python.core.PyList  
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.

注意 PyTuple变成了 PyJavaInstance,然后是 PyList.还要注意 toJava 表单的格式不一样了。这是因为它是一个 Java 对象,并且它是由 Java toString() 方法而不是 Jython repr()函数打印的。Jython 将 PyJavaInstance 这种类型原样传递给 Java API。 ***,注意 data 和 fromJava 值是相同的,只不过元组现在是一个相应的列表。

【编辑推荐】

  1. Jython访问Java属性文件的方法一览
  2. 用于Jython连接Java的JavaUtils模块
  3. Jython线程示例:定义共享缓冲区
  4. 与Java语言相比Jython开发的独特性能
  5. 与Java相比Jython性能表现
责任编辑:yangsai 来源: 网络
相关推荐

2023-10-16 09:26:48

CSS类型转换

2009-06-05 11:16:58

字符串动态转换

2024-02-19 15:38:08

JsonPython字符串

2017-05-25 15:14:36

2020-12-17 08:08:15

CentOS

2009-07-31 14:09:41

c#时间格式转换

2024-05-30 08:40:41

大型语言模型LLM人工智能

2022-05-19 09:01:08

TypeScript元组对象

2021-12-29 16:40:54

Python语言字符串

2024-01-04 09:17:03

前端开发CSV 格式JSON 字符串

2009-11-25 16:55:45

PHP函数explod

2011-04-08 10:16:13

文本文件ACCESS数据库

2021-04-22 07:41:46

JavaScript类型转换

2022-05-11 17:21:05

Btrfs文件系统Fedora

2018-09-10 15:14:27

前端WebURL

2015-08-13 10:48:39

Java 8转换及改进

2023-03-20 08:14:11

PHP类型转换

2022-10-12 08:00:00

语音识别Node.js音频质量

2021-10-29 15:13:21

LinuxPDF文件

2023-08-26 16:06:10

COBOLJava数据
点赞
收藏

51CTO技术栈公众号