public static JavaProxyClass initProxyClass(Class proxy) { return new JavaProxyClass(proxy); }
public static Object newProxyInstance(Ruby runtime, Class superClass, Class[] interfaces, Class[] constructorParameters, Object[] constructorArgs, JavaProxyInvocationHandler handler) throws IllegalArgumentException, InstantiationException, IllegalAccessException, InvocationTargetException, SecurityException, NoSuchMethodException { JavaProxyClass jpc = getProxyClass(runtime, superClass, interfaces); JavaProxyConstructor cons = jpc.getConstructor(constructorParameters == null ? new Class[0] : constructorParameters); return cons.newInstance(constructorArgs, handler); }
JavaProxyClass(Class proxyClass) { super(getThreadLocalRuntime(), (RubyClass) getThreadLocalRuntime().getModule("Java").getClass("JavaProxyClass")); this.proxyClass = proxyClass; this.constructors = buildRubyArray(getConstructors()); }
public static Object newProxyInstance(Ruby runtime, Class superClass, Class[] interfaces, Class[] constructorParameters, Object[] constructorArgs, JavaProxyInvocationHandler handler) throws IllegalArgumentException, InstantiationException, IllegalAccessException, InvocationTargetException, SecurityException, NoSuchMethodException { JavaProxyClass proxyClass = newProxyClass(runtime, superClass, interfaces); JavaProxyConstructor constructor = proxyClass.getConstructor( constructorParameters == null ? EMPTY_CLASS_ARRAY : constructorParameters ); return constructor.newInstance(constructorArgs, handler); }
@JRubyMethod public final RubyArray constructors() { return toRubyArray( getConstructors() ); }
private IRubyObject tryProxyInvocation(ThreadContext context, Object javaInvokee, Object arg0, Object arg1, Object arg2) { JavaProxyClass jpc = ((InternalJavaProxy) javaInvokee).___getProxyClass(); JavaProxyMethod jpm; if ((jpm = jpc.getMethod(method.getName(), parameterTypes)) != null && jpm.hasSuperImplementation()) { return invokeDirectSuperWithExceptionHandling(context, jpm.getSuperMethod(), javaInvokee, arg0, arg1, arg2); } else { return invokeDirectWithExceptionHandling(context, method, javaInvokee, arg0, arg1, arg2); } }
@JRubyMethod public RubyObject superclass() { return JavaClass.get(getRuntime(), getSuperclass()); }
JavaProxyMethod initMethod(String name, String desc, boolean hasSuper) { Class proxy = proxyClass; try { Class[] parms = parse(proxy.getClassLoader(), desc); Method m = proxy.getDeclaredMethod(name, parms); Method sm = null; if (hasSuper) { sm = proxy.getDeclaredMethod("__super$" + name, parms); } JavaProxyMethod jpm = new ProxyMethodImpl(getRuntime(), this, m, sm); methods.add(jpm); List<JavaProxyMethod> methodsWithName = methodMap.get(name); if (methodsWithName == null) { methodsWithName = new ArrayList<JavaProxyMethod>(2); methodMap.put(name,methodsWithName); } methodsWithName.add(jpm); return jpm; } catch (ClassNotFoundException e) { throw new InternalError(e.getMessage()); } catch (SecurityException e) { throw new InternalError(e.getMessage()); } catch (NoSuchMethodException e) { throw new InternalError(e.getMessage()); } }
public static JavaProxyClass getProxyClass(Ruby runtime, Class superClass, Class[] interfaces) throws InvocationTargetException { return getProxyClass(runtime,superClass,interfaces,null); }
public JavaProxyConstructor getConstructor(final Class[] args) throws SecurityException, NoSuchMethodException { final Class[] realArgs = new Class[args.length + 1]; System.arraycopy(args, 0, realArgs, 0, args.length); realArgs[ args.length ] = JavaProxyInvocationHandler.class; @SuppressWarnings("unchecked") Constructor<?> constructor = proxyClass.getConstructor(realArgs); return new JavaProxyConstructor(getRuntime(), this, constructor); }
@JRubyMethod public RubyArray methods() { return toRubyArray( getMethods() ); }
@JRubyMethod public RubyArray interfaces() { return toRubyArray(getInterfaces()); }
@JRubyMethod public RubyArray methods() { return buildRubyArray(getMethods()); }
@JRubyMethod public RubyArray interfaces() { return buildRubyArray(getInterfaces()); }
@Override public final IRubyObject call(final ThreadContext context, IRubyObject self, RubyModule clazz, String name, IRubyObject[] args) { final int arity = args.length; final JavaProxyConstructor[] constructors = getProxyClass(self).getConstructors(); final JavaProxyConstructor matching; switch (constructors.length) { case 1: matching = matchConstructor0(context, constructors, arity, args); break; default: matching = matchConstructor(context, constructors, arity, args); } JavaObject newObject = matching.newInstance(self, args); return JavaUtilities.set_java_object(self, self, newObject); }
public static void createJavaProxyClasses(final Ruby runtime, final RubyModule Java) { JavaProxyClass.createJavaProxyClassClass(runtime, Java); ProxyMethodImpl.createJavaProxyMethodClass(runtime, Java); JavaProxyConstructor.createJavaProxyConstructorClass(runtime, Java); }
public final String nameOnInspection() { return "[Proxy:" + getSuperclass().getName() + ']'; } }
private IRubyObject tryProxyInvocation(ThreadContext context, Object javaInvokee, Object arg0, Object arg1, Object arg2, Object arg3) { JavaProxyClass jpc = ((InternalJavaProxy) javaInvokee).___getProxyClass(); JavaProxyMethod jpm; if ((jpm = jpc.getMethod(method.getName(), parameterTypes)) != null && jpm.hasSuperImplementation()) { return invokeDirectSuperWithExceptionHandling(context, jpm.getSuperMethod(), javaInvokee, arg0, arg1, arg2, arg3); } else { return invokeDirectWithExceptionHandling(context, method, javaInvokee, arg0, arg1, arg2, arg3); } }
@JRubyMethod public RubyObject superclass() { return JavaClass.get(getRuntime(), getSuperclass()); }
JavaProxyMethod initMethod(String name, String desc, boolean hasSuper) { Class proxy = proxyClass; try { Class[] parms = parse(proxy.getClassLoader(), desc); Method m = proxy.getDeclaredMethod(name, parms); Method sm = null; if (hasSuper) { sm = proxy.getDeclaredMethod("__super$" + name, parms); } JavaProxyMethod jpm = new ProxyMethodImpl(getRuntime(), this, m, sm); methods.add(jpm); List<JavaProxyMethod> methodsWithName = methodMap.get(name); if (methodsWithName == null) { methodsWithName = new ArrayList<JavaProxyMethod>(2); methodMap.put(name,methodsWithName); } methodsWithName.add(jpm); return jpm; } catch (ClassNotFoundException e) { throw new InternalError(e.getMessage()); } catch (SecurityException e) { throw new InternalError(e.getMessage()); } catch (NoSuchMethodException e) { throw new InternalError(e.getMessage()); } }