Java Bridge 局限性
Java Bridge 旨在作为让 PHP 脚本使用 Java 类的简单方法使用。考虑这一点,有几个其中未包含的更为高级的功能。其中最重要的是可靠地调用重载方法。
Java Bridge 完全 根据提供的参数数量选择方法或构造函数。如果存在多个可能性,则 Java Bridge 将选择第一个方法或构造函数并试用。这极为简单,使用错误的参数类型调用构造函数或方法时,会引发异常。
使用签名选择重载
选择合适的重载的问题已经在最新的 Project Zero 构建版本(在 WebSphere sMash 1.0 中不 可用)中通过添加新的 JavaSignature 类得到了解决。JavaSignature 允许脚本通过定义参数类型查找以下内容来明确指定调用哪个构造函数或方法:
<?php
$signature = new JavaSignature(JAVA_STRING);
$string = new Java("java.lang.String",
$signature, "Hello World!");
var_dump($string->toLowerCase());
var_dump($string->split(" "));
var_dump($string->toUpperCase());
?>
JavaSignature 的参数来自以下 PHP 常量:
● JAVA_BOOLEAN
● JAVA_BYTE
● JAVA_CHAR
● JAVA_SHORT
● JAVA_INT
● JAVA_LONG
● JAVA_FLOAT
● JAVA_DOUBLE
● JAVA_STRING
● JAVA_OBJECT
在前面的示例中,示例选择了 java.lang.String 上的构造函数,此构造函数接受单个 Java String 作为其参数 (JAVA_STRING)。多个参数使用逗号分隔,例如,newJavaSignature(JAVA_STRING, JAVA_INT)。可以使用 JAVA_ARRAY 修饰符指定 Java 类型的数组。例如,以下代码将选择字符串数组: newJavaSignature(JAVA_STRING | JAVA_ARRAY)。
以下代码片段显示了一个 JavaSignature,它选择 java.lang.String 上的 valueOf 方法的重载。请注意签名作为第一个参数如何传递到方法调用。Java Bridge 知道对其进行检查来获取签名。
<?php
$class = new JavaClass("java.lang.String");
$signature = new JavaSignature(JAVA_INT);
var_dump($class->valueOf($signature, 1234567890));
?>
方法名称区分大小写
PHP 中的方法不区分大小写,而 Java 区分大小写。Java Bridge 区分大小写,因此 PHP 方法名称必须与 Java 方法名称完全匹配。
静态方法和字段
Java 开发人员习惯使用类名称调用静态方法和字段(例如,Integer.MAX_VALUE)。这在 PHP 中尚不可能,因此必须使用 JavaClass.脚本创建 JavaClass 的实例,并使用此实例调用静态方法和访问静态字段。这种做法并不常见,因为需要开发人员创建仅用于访问非实例(静态)方法和字段的对象的实例。
遍历集合
前面的示例代码说明了如何遍历 Java 集合。这相当冗长,比 PHP foreach 语句的开销少。目前,Java Bridge 并未将 Java 迭代器和 PHP foreach 语句集成。以下代码说明了如何在 PHP 中使用 Java 迭代器:
$iterator = $list->iterator();
while ($iterator->hasNext() == TRUE) {
var_dump($iterator->next()); echo "<br/>";
}