`
fman
  • 浏览: 53687 次
  • 性别: Icon_minigender_1
  • 来自: 苏州
文章分类
社区版块
存档分类
最新评论

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"))
 

分享到:
评论

相关推荐

    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开源包9

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

    java开源包101

    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协议包...

    QCon 2009 beijing全球企业开发大会ppt:14.让Ruby和Rails让Ruby语言融入于Java项目

    通过 JRuby,Ruby 语言和 Rails 框架得以与 Java 项目无缝结合,不仅提高了开发效率,还增强了软件的灵活性和可扩展性。对于那些已经拥有大量 Java 资产的企业来说,这是一个非常有价值的策略,可以帮助他们更好地...

    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