今天同僚遇到的問題,用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,echo
args){
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方法,因而下面的調用才是正确的,盡管顯的麻煩:
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