如何将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 None: return 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 None: return 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. print
  8. print "type(%s)=%s" % ("data", type(data))
  9. print "type(%s)=%s" % ("toJava", type(toJava))
  10. print "type(%s)=%s" % ("fromJava", type(fromJava))

打印:

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

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

本文题目:如何将Jython类型转换为Java类型
URL分享:http://www.shufengxianlan.com/qtweb/news45/458595.html

网站建设、网络推广公司-创新互联,是专注品牌与效果的网站制作,网络营销seo公司;服务项目有等

广告

声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 创新互联