如何将Jython类型转换为Java类型
创始人
2024-04-16 05:11:13
0

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.  
  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: (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.  
  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性能表现

相关内容

热门资讯

如何允许远程连接到MySQL数... [[277004]]【51CTO.com快译】默认情况下,MySQL服务器仅侦听来自localhos...
如何利用交换机和端口设置来管理... 在网络管理中,总是有些人让管理员头疼。下面我们就将介绍一下一个网管员利用交换机以及端口设置等来进行D...
施耐德电气数据中心整体解决方案... 近日,全球能效管理专家施耐德电气正式启动大型体验活动“能效中国行——2012卡车巡展”,作为该活动的...
20个非常棒的扁平设计免费资源 Apple设备的平面图标PSD免费平板UI 平板UI套件24平图标Freen平板UI套件PSD径向平...
德国电信门户网站可实时显示全球... 德国电信周三推出一个门户网站,直观地实时提供其安装在全球各地的传感器网络检测到的网络攻击状况。该网站...
为啥国人偏爱 Mybatis,... 关于 SQL 和 ORM 的争论,永远都不会终止,我也一直在思考这个问题。昨天又跟群里的小伙伴进行...
《非诚勿扰》红人闫凤娇被曝厕所... 【51CTO.com 综合消息360安全专家提醒说,“闫凤娇”、“非诚勿扰”已经被黑客盯上成为了“木...
2012年第四季度互联网状况报... [[71653]]  北京时间4月25日消息,据国外媒体报道,全球知名的云平台公司Akamai Te...