今天同事遇到的问题,用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"))
分享到:
- 2008-06-14 22:41
- 浏览 1286
- 评论(3)
- 论坛回复 / 浏览 (3 / 3056)
- 查看更多
相关推荐
通过分析这些源代码,开发者可以学习到如何在JRUBY中调用Java类,理解JRuby与Java之间的互操作性,例如使用`Java::JavaLang::System`来访问Java的系统类,或者使用`JRuby::JavaExtensions`来增强Ruby对象的Java功能...
8. **集合工厂方法**:Java 1.7对集合框架进行了优化,添加了工厂方法,如`Collections.emptyList()`, `Collections.singleton()`, `Map.of()`, 等,方便创建不可变的集合实例。 9. **元注解的可重复性**:从Java ...
php调用java类 Java批量作业执行框架 MyBatchFramework MyBatchFramework 是一个开源的轻量级的用以创建可靠的易管理的批量作业的Java包,主要特点是多线程、调度、JMX管理和批量执行报表,执行历史等。 SIP协议包...
php调用java类 Java批量作业执行框架 MyBatchFramework MyBatchFramework 是一个开源的轻量级的用以创建可靠的易管理的批量作业的Java包,主要特点是多线程、调度、JMX管理和批量执行报表,执行历史等。 SIP协议包...
php调用java类 Java批量作业执行框架 MyBatchFramework MyBatchFramework 是一个开源的轻量级的用以创建可靠的易管理的批量作业的Java包,主要特点是多线程、调度、JMX管理和批量执行报表,执行历史等。 SIP协议包...
php调用java类 Java批量作业执行框架 MyBatchFramework MyBatchFramework 是一个开源的轻量级的用以创建可靠的易管理的批量作业的Java包,主要特点是多线程、调度、JMX管理和批量执行报表,执行历史等。 SIP协议包...
php调用java类 Java批量作业执行框架 MyBatchFramework MyBatchFramework 是一个开源的轻量级的用以创建可靠的易管理的批量作业的Java包,主要特点是多线程、调度、JMX管理和批量执行报表,执行历史等。 SIP协议包...
php调用java类 Java批量作业执行框架 MyBatchFramework MyBatchFramework 是一个开源的轻量级的用以创建可靠的易管理的批量作业的Java包,主要特点是多线程、调度、JMX管理和批量执行报表,执行历史等。 SIP协议包...
php调用java类 Java批量作业执行框架 MyBatchFramework MyBatchFramework 是一个开源的轻量级的用以创建可靠的易管理的批量作业的Java包,主要特点是多线程、调度、JMX管理和批量执行报表,执行历史等。 SIP协议包...
php调用java类 Java批量作业执行框架 MyBatchFramework MyBatchFramework 是一个开源的轻量级的用以创建可靠的易管理的批量作业的Java包,主要特点是多线程、调度、JMX管理和批量执行报表,执行历史等。 SIP协议包...
- 可变参数允许方法接受不定数量的参数,它在语法上表现为一个数组,但在实际调用时可以传递任意数量的相同类型的参数。 5. **泛型(Generics)** - 泛型引入了类型参数的概念,增强了代码的类型安全性,避免了...
使用 var 定义的变量是可变得,在 Scala 中鼓励使用 val。 2. Scala 编译器会自动推断变量的类型,必要的时候可以指定类型;变量名在前,类型在后。 常用类型 Scala 和 Java 一样,有 7 种数值类型 Byte、Char、...
php调用java类 Java批量作业执行框架 MyBatchFramework MyBatchFramework 是一个开源的轻量级的用以创建可靠的易管理的批量作业的Java包,主要特点是多线程、调度、JMX管理和批量执行报表,执行历史等。 SIP协议包...
php调用java类 Java批量作业执行框架 MyBatchFramework MyBatchFramework 是一个开源的轻量级的用以创建可靠的易管理的批量作业的Java包,主要特点是多线程、调度、JMX管理和批量执行报表,执行历史等。 SIP协议包...
php调用java类 Java批量作业执行框架 MyBatchFramework MyBatchFramework 是一个开源的轻量级的用以创建可靠的易管理的批量作业的Java包,主要特点是多线程、调度、JMX管理和批量执行报表,执行历史等。 SIP协议包...
php调用java类 Java批量作业执行框架 MyBatchFramework MyBatchFramework 是一个开源的轻量级的用以创建可靠的易管理的批量作业的Java包,主要特点是多线程、调度、JMX管理和批量执行报表,执行历史等。 SIP协议包...
php调用java类 Java批量作业执行框架 MyBatchFramework MyBatchFramework 是一个开源的轻量级的用以创建可靠的易管理的批量作业的Java包,主要特点是多线程、调度、JMX管理和批量执行报表,执行历史等。 SIP协议包...
- **集合工厂方法**:如`List.of()`, `Set.of()`, `Map.of()`等,提供了一种创建不可变集合的简便方式。 - **双泛型接口的改进**:如`Supplier<T>`和`BiFunction, U, R>`,支持了两个输入参数的函数式接口。 3. *...
安装过程中,选择合适的安装路径,然后设置环境变量,包括`JAVA_HOME`、`PATH`和`CLASSPATH`,确保系统能够找到Java可执行文件和库。 安装完成后,可以通过命令行输入`java -version`和`javac -version`来检查Java...