Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

JSR223: Calling Java "varargs" methods from script

I have a method that looks like this on Java:

public void myMethod(Object... parms);

But I can't call this method as expected from the scripts.

If, in ruby, I do:

$myObject.myMethod(42);

It gives me org.jruby.exceptions.RaiseException: could not coerce Fixnum to class [Ljava.lang.Object

If I try the following in Javascript:

myObject.myMethod(42);

Then it gives me sun.org.mozilla.javascript.internal.EvaluatorException: Can't find method MyClass.test(number). (#2) in at line number 2

Of course, if I change the signature to take one single object then it works.

I assume that this is because someone along the line does not know how to convert, say Integer to Integer[] with the value at the first position.

I believe something like myMethod({42, 2009}) would work in Ruby, but this seems ugly - I wanted to be able to just do myMethod(42, 2009) to make it less confusing, specially for other languages. Is there any better workaround for this?

Thanks.

like image 774
John Without Arms Avatar asked Jul 04 '09 21:07

John Without Arms


2 Answers

Java internally treats the variable-length argument list as an array whose elements are all of the same type. That is the reason why you need to provide an array of objects in your JRuby script.

It works like this:

myMethod [42, 2009].to_java

The to_java method constructs a Java array from a Ruby array. By default, to_java constructs Object arrays as needed in this case. If you need a String array you would use

["a","b","c"].to_java(:string)

More on this at the JRuby wiki

like image 159
MartinGross Avatar answered Nov 11 '22 05:11

MartinGross


It seems like this is a known bug in jruby. See method dispatch on Java objects / classes should try to find a matching varargs method and NameError thrown when trying to pass argument to a Java method that is defined as having variable length arguments.

According to the link Rhino does support vararg.

like image 1
Eugene Yokota Avatar answered Nov 11 '22 04:11

Eugene Yokota