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

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

Jython类型映射 Java类型

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

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

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

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

映射Java类型

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

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

打印:

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

注意 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

字符串动态转换

2017-05-25 15:14:36

2024-02-19 15:38:08

JsonPython字符串

2020-12-17 08:08:15

CentOS

2009-07-31 14:09:41

c#时间格式转换

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-08-26 16:06:10

COBOLJava数据

2023-03-20 08:14:11

PHP类型转换

2021-10-29 15:13:21

LinuxPDF文件

2022-10-12 08:00:00

语音识别Node.js音频质量

2022-10-27 20:42:04

JavaScripJava编程语言
点赞
收藏

51CTO技术栈公众号