新聞中心
Jython類(lèi)型映射 Java類(lèi)型

有時(shí)會(huì)需要在 Jython 中創(chuàng)建純 Java 對(duì)象(例如,在需要?jiǎng)?chuàng)建跨網(wǎng)絡(luò)發(fā)送給基于 Java 的服務(wù)器的對(duì)象、或者在需要向一個(gè)類(lèi)型敏感的 Java 服務(wù)(如帶有 Swing 表格單元值的服務(wù))傳遞對(duì)象時(shí))。要將 Jython類(lèi)型轉(zhuǎn)換為 Java類(lèi)型(以及相反),使用下面例子中的函數(shù):
- 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 None: return 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類(lèi)型轉(zhuǎn)換為Java類(lèi)型 """
- if object is None: return object
- t = type(object)
- if t == TupleType or t == ListType:
- result = mapSeqToJava(object)
- elif t == DictType:
- result = mapDictToJava(object)
- else:
- result = object
- return result
在使用了 mapToJava 后,這些類(lèi)型可以寫(xiě)為java.io.ObjectOutputStream。從 java.io.ObjectInputStream 讀出一個(gè)對(duì)象后,可以用 mapFromJava 將對(duì)象轉(zhuǎn)換回 Jython 類(lèi)型。
注意這些方法支持有限的、但是廣泛使用的一組內(nèi)置 Jython類(lèi)型。Jython 自動(dòng)轉(zhuǎn)換類(lèi)似值的類(lèi)型,如數(shù)字和字符串。不支持用戶(hù)定義的類(lèi)。
映射Java類(lèi)型
繼續(xù)這個(gè)例子,下面顯示了繼續(xù)使用上一屏討論的映射函數(shù)的情況:
- 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 "type(%s)=%s" % ("data", type(data))
- print "type(%s)=%s" % ("toJava", type(toJava))
- print "type(%s)=%s" % ("fromJava", type(fromJava))
打印:
- data: (1, 2, 3, [1, 2, 3], ['H', 'e', 'l', 'l', 'o', '!'], 'Hello!', \
- {2: 'two', 1: 'one'})
- toJava: [1, 2, 3, [1, 2, 3], [H, e, l, l, o, !], Hello!, {2=two, 1=one}]
- fromJava: [1, 2, 3, [1, 2, 3], ['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
注意 PyTuple變成了 PyJavaInstance,然后是 PyList.還要注意 toJava 表單的格式不一樣了。這是因?yàn)樗且粋€(gè) Java 對(duì)象,并且它是由 Java toString() 方法而不是 Jython repr()函數(shù)打印的。Jython 將 PyJavaInstance 這種類(lèi)型原樣傳遞給 Java API。 ***,注意 data 和 fromJava 值是相同的,只不過(guò)元組現(xiàn)在是一個(gè)相應(yīng)的列表。
網(wǎng)站題目:如何將Jython類(lèi)型轉(zhuǎn)換為Java類(lèi)型
文章源于:http://m.5511xx.com/article/dhedchp.html


咨詢(xún)
建站咨詢(xún)
