【问题标题】:About PHP/Java Bridge Invoke Java method with Object parameter关于 PHP/Java Bridge 使用 Object 参数调用 Java 方法
【发布时间】:2015-02-11 10:48:36
【问题描述】:

我成功运行了 PHP/Java 桥接项目和 test.php 但我有一个问题。 我想用 Java Object 参数调用 Java 方法 Java 源代码:

public class OtherClass {
    public BaseBean funBean(BaseBean param){
        param.setName("Bean Name");
        return param;
    }
}

public class BaseBean {
    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String name;

}

PHP 脚本: 我希望它可以那样运行,它不能。

<?php
require_once("java/Java.inc");
//require_once("java/java_helper.php");

class BaseBean{
    public $name;
}
$eh = new java("com.anima.service.OtherClass");
$cla = new BaseBean();
$cla->name = "nameTest";
$eh->funBean($cla);
?>

或者有一些解决方案可以帮助我实现这个想法。 我想用 php 对象调用 java 方法。

你能请任何人帮助我吗?

提前致谢。

【问题讨论】:

    标签: java php php-java-bridge


    【解决方案1】:

    我猜你也应该将 BaseBean 创建为“java 实例”:

    $cla = new java("com.anima.service.BaseBean");
    

    或者,您也可以尝试使用 java_closure,但我认为在这种情况下,您必须像这样更改 java 方法中的预期类型:

    public Object funBean(Object param){ ... }
    $cla = new BaseBean();
    $cla->name = "nameTest";
    $jObjCla = java_closure($cla);
    $eh->funBean($jObjCla);
    

    我在PHP/Java bridge documentation 中发现 java_closure 方法有第三个参数,什么是 Java 接口数组,应该由创建的包装对象实现:

    java_closure(new Listener(), null, array(new Java("java.awt.event.ActionListener")));
    

    Java 源代码:

    public interface IBaseBean {
        String getName();
        void setName(String name);
    }
    
    public class OtherClass {
        public IBaseBean funBean(IBaseBean param){
            param.setName("Bean Name");
            return param;
        }
    }
    
    public class BaseBean implements IBaseBean {
        public String getName() {
            return name;
        }
        public void setName(String name) {
            this.name = name;
        }
        public String name;
    }
    

    PHP 脚本:

    <?php
    require_once("java/Java.inc");
    
    class BaseBean{
        public $name;
    }
    $eh = new java("com.anima.service.OtherClass");
    $cla = new BaseBean();
    $cla->name = "nameTest";
    $jObjCla = java_closure($cla, null, array(new Java("com.anima.service.IBaseBean")));
    $eh->funBean($jObjCla );
    ?>
    

    【讨论】:

    • 感谢回答,但出现错误 java 调用堆栈:2 月 11 日 19:52:15 JavaBridge 错误:发生异常:java.lang.IllegalArgumentException:参数类型不匹配 php 调用堆栈:警告:检测到未经检查的异常:[[o:Response$UndeclaredThrowableErrorMarker]:"FATAL: Undeclared java.lang.RuntimeException detected. java.lang.Exception: Invoke failed: [[o:OtherClass]]->funBean((o:BaseBean)[ o:$Proxy1])。原因:java.lang.IllegalArgumentException:参数类型不匹配 VM:
    • 很抱歉我现在无法尝试,因为我这里没有环境,但是您是否也更改了 funBean 方法? (期望接口而不是类)
    • 那么,它现在工作了吗?还是我回家后检查一下?
    • 是的,它可以工作,非常感谢:) 但是php脚本应该像Java接口一样实现getter&setter
    猜你喜欢
    • 2016-11-06
    • 1970-01-01
    • 2010-10-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-19
    • 2015-12-20
    相关资源
    最近更新 更多