`

JRuby中调用java带可变参数的方法

阅读更多

    今天同事遇到的问题,用JRuby调用一个java方法,该方法使用了jdk1.5的可变参数。我一开始以为只要简单地将可变参数表示为数组即可,例如下面的两个java类:

public class Echo{
    public void echo(String name){
       System.out.println(name);
    }
}
public class Test{
    public void hello(String name,Echoargs){
        System.out.println("hello,"+name);
        for(Echo e:args){
            e.echo(name);
        }
    }
}
 

   我想在jruby中调用Test的hello方法,该方法有个可变参数args。所谓可变参数经过编译后其实也就是数组,这个可以通过观察字节码知道,那么如果用数组来调用可以不?

require 'java'
require 'test.jar'
include_class 'Test'
include_class 'Echo'
t.hello("dennis")  #报错,参数不匹配
t.hello("dennis",[])  #报错,类型不匹配
 

   很遗憾,这样调用是错误的,原因如上面的注释。具体到类型不匹配,本质的原因是JRuby中的数组与java中对数组的字节码表示是不一致的,JRuby 中的数组是用org.jruby.RubyArray类来表示,而hello方法需要的数组却是是[LEcho。解决的办法就是将JRuby的数组转成 java需要的类型,通过to_java方法,因而下面的调用才是正确的,尽管显的麻烦:

 

require 'java'
require 'test.jar'
include_class 'Test'
include_class 'Echo'
t=Test.new
t.hello("dennis",[].to_java("Echo"))
e1=Echo.new
t.hello("dennis",[e1].to_java("Echo"))
e2=Echo.new
t.hello("dennis",[e1,e2].to_java("Echo"))
 


分享到:
评论
3 楼 yangzhihuan 2008-06-16  
上文提到遇到问题的人就是小弟,搞半天没搞定这个问题啊,满心感激,特来捧一下场,本来不打算写一篇blog的,现在看来是不用了,收藏即可,哈哈....
2 楼 dennis_zane 2008-06-16  
RednaxelaFX 写道
这个问题去年有人在JRuby的JIRA上提出过:
http://jira.codehaus.org/browse/JRUBY-195
可以参考下

嗯,谢谢,貌似还没fix,现在这样的处理方法暂时够应付了。
1 楼 RednaxelaFX 2008-06-16  
这个问题去年有人在JRuby的JIRA上提出过:
http://jira.codehaus.org/browse/JRUBY-195
可以参考下

相关推荐

    j-monkeybars.zip(使用 JRuby 和 Swing 进行跨平台开发的源代码)

    通过分析这些源代码,开发者可以学习到如何在JRUBY中调用Java类,理解JRuby与Java之间的互操作性,例如使用`Java::JavaLang::System`来访问Java的系统类,或者使用`JRuby::JavaExtensions`来增强Ruby对象的Java功能...

    JAVA_API_1.7中文版

    8. **集合工厂方法**:Java 1.7对集合框架进行了优化,添加了工厂方法,如`Collections.emptyList()`, `Collections.singleton()`, `Map.of()`, 等,方便创建不可变的集合实例。 9. **元注解的可重复性**:从Java ...

    java开源包1

    php调用java类 Java批量作业执行框架 MyBatchFramework MyBatchFramework 是一个开源的轻量级的用以创建可靠的易管理的批量作业的Java包,主要特点是多线程、调度、JMX管理和批量执行报表,执行历史等。 SIP协议包...

    java开源包4

    php调用java类 Java批量作业执行框架 MyBatchFramework MyBatchFramework 是一个开源的轻量级的用以创建可靠的易管理的批量作业的Java包,主要特点是多线程、调度、JMX管理和批量执行报表,执行历史等。 SIP协议包...

    java开源包6

    php调用java类 Java批量作业执行框架 MyBatchFramework MyBatchFramework 是一个开源的轻量级的用以创建可靠的易管理的批量作业的Java包,主要特点是多线程、调度、JMX管理和批量执行报表,执行历史等。 SIP协议包...

    java开源包101

    php调用java类 Java批量作业执行框架 MyBatchFramework MyBatchFramework 是一个开源的轻量级的用以创建可靠的易管理的批量作业的Java包,主要特点是多线程、调度、JMX管理和批量执行报表,执行历史等。 SIP协议包...

    java开源包9

    php调用java类 Java批量作业执行框架 MyBatchFramework MyBatchFramework 是一个开源的轻量级的用以创建可靠的易管理的批量作业的Java包,主要特点是多线程、调度、JMX管理和批量执行报表,执行历史等。 SIP协议包...

    java开源包5

    php调用java类 Java批量作业执行框架 MyBatchFramework MyBatchFramework 是一个开源的轻量级的用以创建可靠的易管理的批量作业的Java包,主要特点是多线程、调度、JMX管理和批量执行报表,执行历史等。 SIP协议包...

    java开源包8

    php调用java类 Java批量作业执行框架 MyBatchFramework MyBatchFramework 是一个开源的轻量级的用以创建可靠的易管理的批量作业的Java包,主要特点是多线程、调度、JMX管理和批量执行报表,执行历史等。 SIP协议包...

    java开源包10

    php调用java类 Java批量作业执行框架 MyBatchFramework MyBatchFramework 是一个开源的轻量级的用以创建可靠的易管理的批量作业的Java包,主要特点是多线程、调度、JMX管理和批量执行报表,执行历史等。 SIP协议包...

    良葛格java jdk 5.0学习笔记

    - 可变参数允许方法接受不定数量的参数,它在语法上表现为一个数组,但在实际调用时可以传递任意数量的相同类型的参数。 5. **泛型(Generics)** - 泛型引入了类型参数的概念,增强了代码的类型安全性,避免了...

    Scala编程基础.docx

    使用 var 定义的变量是可变得,在 Scala 中鼓励使用 val。 2. Scala 编译器会自动推断变量的类型,必要的时候可以指定类型;变量名在前,类型在后。 常用类型 Scala 和 Java 一样,有 7 种数值类型 Byte、Char、...

    java开源包3

    php调用java类 Java批量作业执行框架 MyBatchFramework MyBatchFramework 是一个开源的轻量级的用以创建可靠的易管理的批量作业的Java包,主要特点是多线程、调度、JMX管理和批量执行报表,执行历史等。 SIP协议包...

    Java资源包01

    php调用java类 Java批量作业执行框架 MyBatchFramework MyBatchFramework 是一个开源的轻量级的用以创建可靠的易管理的批量作业的Java包,主要特点是多线程、调度、JMX管理和批量执行报表,执行历史等。 SIP协议包...

    java开源包2

    php调用java类 Java批量作业执行框架 MyBatchFramework MyBatchFramework 是一个开源的轻量级的用以创建可靠的易管理的批量作业的Java包,主要特点是多线程、调度、JMX管理和批量执行报表,执行历史等。 SIP协议包...

    java开源包11

    php调用java类 Java批量作业执行框架 MyBatchFramework MyBatchFramework 是一个开源的轻量级的用以创建可靠的易管理的批量作业的Java包,主要特点是多线程、调度、JMX管理和批量执行报表,执行历史等。 SIP协议包...

    java开源包7

    php调用java类 Java批量作业执行框架 MyBatchFramework MyBatchFramework 是一个开源的轻量级的用以创建可靠的易管理的批量作业的Java包,主要特点是多线程、调度、JMX管理和批量执行报表,执行历史等。 SIP协议包...

    jdk api 1.8中文.rar

    - **集合工厂方法**:如`List.of()`, `Set.of()`, `Map.of()`等,提供了一种创建不可变集合的简便方式。 - **双泛型接口的改进**:如`Supplier<T>`和`BiFunction, U, R>`,支持了两个输入参数的函数式接口。 3. *...

    jdk1.7 64位

    安装过程中,选择合适的安装路径,然后设置环境变量,包括`JAVA_HOME`、`PATH`和`CLASSPATH`,确保系统能够找到Java可执行文件和库。 安装完成后,可以通过命令行输入`java -version`和`javac -version`来检查Java...

Global site tag (gtag.js) - Google Analytics