0

爪哇:

package test;

public class HelloWorld {
public HelloWorld(String args){
}

public void ppp(){
    System.out.println("....");
};

public  void set(HelloWorld hw){
    hw.ppp();
}

public static final String JAVABRIDGE_PORT = "28080";
static final php.java.bridge.JavaBridgeRunner runner = php.java.bridge.JavaBridgeRunner
        .getInstance(JAVABRIDGE_PORT);

public static void main(String args[]) throws Exception {
    runner.waitFor();
}
}

PHP:

<?php
require_once("/home/gt/workspace/JavaPhp/Java.inc");
use test\HelloWorld;

class abc extends HelloWorld{
function ppp(){
echo "!!!!";
}
}

$hw =new java("test.HelloWorld","str");
$hw -> set(new abc("str"));

您可以在 PHP 代码中看到一个 php 类扩展 Java 类,set()方法是 Java 的方法,它让 PHP 类传递到 Java 端。

它可以打印“!!!!” 不是 ”....” ?

我知道 py4j 可以做到,想知道 PHP/Java Bridge 是如何做到的?

4

1 回答 1

0

您可以使用自定义 php5/php7 __autoload 函数来实现它,该函数检查每个参数,如果它是 Java 实例,则使用 java_closure() 将其包装,并为包装的 Java 类型生成接口列表。在伪代码中类似于:

java_autoload_function() {...
__call(java_closure($type, null, $Class->getInterfaces($type)))
}

在 Java.inc 中需要不超过 ~10-15 行的附加 PHP 代码。

于 2017-02-12T10:26:09.723 回答