8.1.Java映射
上述函数列表中有一组函数专用于直接在Jess中复制Java对象。使用该组函数可以实现,除了定义新的类以外的,所有Java代码。下例中将建立一个名为HashMap的Java类,在Jess中使用该类,添加一个新的字串型对象,然后查找一个对象并显示该对象。
Jess> (bind ?ht (new java.util.HashMap)) <Java-Object:java.util.HashMap> Jess> (call ?ht put "key1" "element1") Jess> (call ?ht put "key2" "element2") Jess> (call ?ht get "key1") "element1"
由此可见,Jess可以自如的在Java和Jess类型中转换。不能表示为Jess类型的Java对象称为Java对象值(Java object values)。上例中的HashMap就是其中之一。
大多数时候可以省略调用(call),其符号表示有点类似Java代码。例如:
Jess> (bind ?ht (new java.util.HashMap)) <Java-Object:java.util.HashMap> Jess> (?ht put "key1" "element1") Jess> (?ht put "key2" "element2") Jess> (?ht get "key1") "element1"
仅当调用静态方法时才必须使用call语句。
通过使用set-member和get-member函数,Jess也能访问Java对象的成员变量(member variables)。
Jess> (bind ?pt (new java.awt.Point)) <Java-Object:java.awt.Point> Jess> (set-member ?pt x 37) 37 Jess> (set-member ?pt y 42) 42 Jess> (get-member ?pt x) 37
访问静态成员时,可以使用类名代替对象名作为这些函数的第一个参数。
Jess> (get-member System out) <Java-Object:java.io.PrintStream>
注意:不用像在Java中一样使用“java.lang.System”,java.lang包已作为Java代码被隐式的引入Jess。Jess同样拥有import函数可以显示的引入这些包。
Jess根据下表将Java值转换为Jess类型值。
Java type | Jess type |
A null reference | The symbol 'nil' |
A void return value | The symbol 'nil' |
String | RU.STRING |
An array | A Jess list |
boolean or java.lang.Boolean | The symbols 'TRUE' and 'FALSE' |
byte, short, int, or their wrappers | RU.INTEGER |
long or Long | RU.LONG |
double, float or their wrappers | RU.FLOAT |
char or java.lang.Character | RU.SYMBOL |
anything else | RU.JAVA_OBJECT |
由上表可见Jess将Jess值转为Java类型时比较自由。通常在进行这样的转换时,Jess事先对转换目标有所了解,例如:当Jess有一个java.lang.Class对象和一个jess.Value对象,要将Value对象所含的内容转换为可匹配于由该类命名的Jess类型时。而“TRUE”符号可以传递给以布尔值为参数的函数,或者以字符串为参数的函数,这两种情况下都可以用call调用。
Jess type | Possible Java types |
RU.JAVA_OBJECT | The wrapped object |
The symbol 'nil' | A null reference |
The symbols 'TRUE' or 'FALSE' | java.lang.Boolean or boolean |
RU.SYMBOL, RU.STRING | String, char, java.lang.Character |
RU.FLOAT | float, double, and their wrappers |
RU.INTEGER | long, short, int, byte, char, and their wrappers |
RU.LONG | long, short, int, byte, char, and their wrappers |
RU.LIST | A Java array |
在调用(call)超载的方法(method)时可能会遇到麻烦——例如:将“TRUE”传递给一个已超载而无法接受布尔值或字符串作为参数的Java方法。此时可以显式的使用包类(wrapper class)——本例中可使用java.lang.Boolean对象解决该问题。
要了解更多的关于call,new,set-member,get-member及其它Java综合函数,请参见Jess函数使用指南(Jess function guide)。