天天看點

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,echo

JRuby中調用java帶可變參數的方法

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