@JRubyMethod(frame = true, rest = true)
public RubyObject new_instance2(IRubyObject[] args, Block unusedBlock) {
Arity.checkArgumentCount(getRuntime(), args, 2, 2);
final IRubyObject self = args[0];
final Ruby runtime = self.getRuntime();
final RubyModule javaUtilities = runtime.getJavaSupport().getJavaUtilitiesModule();
RubyArray constructor_args = (RubyArray) args[1];
Class<?>[] parameterTypes = getParameterTypes();
int count = (int) constructor_args.length().getLongValue();
Object[] converted = new Object[count];
for (int i = 0; i < count; i++) {
// TODO: call ruby method
IRubyObject ith = constructor_args.aref(getRuntime().newFixnum(i));
converted[i] = JavaUtil.convertArgument(getRuntime(), Java.ruby_to_java(this, ith, Block.NULL_BLOCK), parameterTypes[i]);
}
JavaProxyInvocationHandler handler = new JavaProxyInvocationHandler() {
public Object invoke(Object proxy, JavaProxyMethod m, Object[] nargs) throws Throwable {
String name = m.getName();
DynamicMethod method = self.getMetaClass().searchMethod(name);
int v = method.getArity().getValue();
IRubyObject[] newArgs = new IRubyObject[nargs.length];
for (int i = nargs.length; --i >= 0; ) {
newArgs[i] = Java.java_to_ruby(
javaUtilities,
JavaObject.wrap(runtime, nargs[i]),
Block.NULL_BLOCK);
}
if (v < 0 || v == (newArgs.length)) {
return JavaUtil.convertRubyToJava(RuntimeHelpers.invoke(runtime.getCurrentContext(), self, name, newArgs), m.getReturnType());
} else {
RubyClass superClass = self.getMetaClass().getSuperClass();
return JavaUtil.convertRubyToJava(RuntimeHelpers.invokeAs(runtime.getCurrentContext(), superClass, self, name, newArgs, Block.NULL_BLOCK), m.getReturnType());
}
}
};
try {