private static void addClass(Set allClasses, Map methods, Class clazz, Set names) { if (allClasses.add(clazz)) { addMethods(methods, clazz, names); Class superClass = clazz.getSuperclass(); if (superClass != null) { addClass(allClasses, methods, superClass, names); } addInterfaces(allClasses, methods, clazz.getInterfaces(), names); } }
private static void addInterfaces(Set allClasses, Map methods, Class[] interfaces, Set names) { for (int i = 0; i < interfaces.length; i++) { addInterface(allClasses, methods, interfaces[i], names); } }
private static void addMethods( final Map<MethodKey, MethodData> methods, final Class classOrIface, final Set<String> names) { final Method[] decMethods = classOrIface.getDeclaredMethods(); for ( int i = 0; i < decMethods.length; i++ ) { final Method decMethod = decMethods[i]; if ( names.contains(decMethod.getName()) ) { addMethod(methods, decMethod); } } }
public JavaProxyClass newProxyClass(final Ruby runtime, ClassDefiningClassLoader loader, String targetClassName, Class superClass, Class[] interfaces, Set<String> names) throws InvocationTargetException { if (targetClassName == null) { targetClassName = targetClassName(superClass); } validateArgs(runtime, targetClassName, superClass); Type selfType = Type.getType('L' + toInternalClassName(targetClassName) + ';'); Map<MethodKey, MethodData> methods = collectMethods(superClass, interfaces, names); return generate(loader, targetClassName, superClass, interfaces, methods, selfType); }
private static Map<MethodKey, MethodData> collectMethods( final Class superClass, final Class[] interfaces, final Set<String> names) { Map<MethodKey, MethodData> methods = new HashMap<>(); HashSet<Class> allClasses = new HashSet<>(); addClass(allClasses, methods, superClass, names); addInterfaces(allClasses, methods, interfaces, names); return methods; }
String pkg = proxyPackageName(superClass); String fullName = superClass.getName(); int ix = fullName.lastIndexOf('.'); cName = fullName.substring(ix+1); targetClassName = pkg + "." + cName + "$Proxy" + nextId(); validateArgs(runtime, targetClassName, superClass); Type selfType = Type.getType("L" + toInternalClassName(targetClassName) + ";"); proxyClass = generate(loader, targetClassName, superClass, interfaces, collectMethods(superClass, interfaces, names), selfType);
private JavaProxyClass generate(ClassLoader loader, String targetClassName, Class superClass, Class[] interfaces, Map<MethodKey, MethodData> methods, Type selfType) { ClassWriter cw = beginProxyClass(targetClassName, superClass, interfaces); GeneratorAdapter clazzInit = createClassInitializer(selfType, cw); generateConstructors(superClass, selfType, cw); generateGetProxyClass(selfType, cw); generateGetInvocationHandler(selfType, cw); generateProxyMethods(superClass, methods, selfType, cw, clazzInit); // finish class initializer clazzInit.returnValue(); clazzInit.endMethod(); // end class cw.visitEnd(); Class clazz = invokeDefineClass(loader, selfType.getClassName(), cw.toByteArray()); // trigger class initialization for the class try { Field proxy_class = clazz.getDeclaredField(PROXY_CLASS_FIELD_NAME); proxy_class.setAccessible(true); return (JavaProxyClass) proxy_class.get(clazz); } catch (Exception ex) { InternalError ie = new InternalError(); ie.initCause(ex); throw ie; } }
private JavaProxyClass generate(ClassDefiningClassLoader loader, String targetClassName, Class superClass, Class[] interfaces, Map<MethodKey, MethodData> methods, Type selfType) { ClassWriter cw = beginProxyClass(targetClassName, superClass, interfaces, loader); GeneratorAdapter clazzInit = createClassInitializer(selfType, cw); generateConstructors(superClass, selfType, cw); generate___getProxyClass(selfType, cw); generate___getInvocationHandler(selfType, cw); generateProxyMethods(superClass, methods, selfType, cw, clazzInit); // finish class initializer clazzInit.returnValue(); clazzInit.endMethod(); // end class cw.visitEnd(); Class clazz = loader.defineClass(selfType.getClassName(), cw.toByteArray()); // trigger class initialization for the class try { Field proxy_class = clazz.getDeclaredField(PROXY_CLASS_FIELD_NAME); // proxy_class.setAccessible(true); // field is public return (JavaProxyClass) proxy_class.get(clazz); } catch (NoSuchFieldException|IllegalAccessException ex) { Helpers.throwException(ex); return null; // re-throws (although unexpected) } }
private static void addInterface(Set allClasses, Map methods, Class interfaze, Set names) { if (allClasses.add(interfaze)) { addMethods(methods, interfaze, names); addInterfaces(allClasses, methods, interfaze.getInterfaces(), names); } }
public static JavaProxyClassFactory createFactory() { JavaProxyClassFactory factory = null; if (PROXY_CLASS_FACTORY != null) { try { Class clazz = Class.forName(PROXY_CLASS_FACTORY); Object instance = clazz.newInstance(); if (instance instanceof JavaProxyClassFactory) { factory = (JavaProxyClassFactory) instance; LOG.info("Created proxy class factory: " + factory); } else { LOG.error("Invalid proxy class factory: " + instance); } } catch (ClassNotFoundException e) { LOG.error("ClassNotFoundException creating proxy class factory: " + e); } catch (InstantiationException e) { LOG.error("InstantiationException creating proxy class factory: " + e); } catch (IllegalAccessException e) { LOG.error("IllegalAccessException creating proxy class factory: " + e); } } if (factory == null) factory = new JavaProxyClassFactory(); return factory; }
public void load(Ruby runtime, boolean wrap) throws IOException { createJavaModule(runtime); RubyModule jpmt = runtime.defineModule("JavaPackageModuleTemplate"); jpmt.getSingletonClass().setSuperClass(new BlankSlateWrapper(runtime, jpmt.getMetaClass().getSuperClass(), runtime.getKernel())); runtime.getLoadService().require("jruby/java"); // rewite ArrayJavaProxy superclass to point at Object, so it inherits Object behaviors RubyClass ajp = runtime.getClass("ArrayJavaProxy"); ajp.setSuperClass(runtime.getJavaSupport().getObjectJavaClass().getProxyClass()); ajp.includeModule(runtime.getEnumerable()); RubyClassPathVariable.createClassPathVariable(runtime); runtime.setJavaProxyClassFactory(JavaProxyClassFactory.createFactory()); // modify ENV_JAVA to be a read/write version Map systemProps = new SystemPropertiesMap(); runtime.getObject().setConstantQuiet( "ENV_JAVA", new MapJavaProxy( runtime, (RubyClass)Java.getProxyClass(runtime, SystemPropertiesMap.class), systemProps)); }
String pkg = proxyPackageName(superClass); String fullName = superClass.getName(); int ix = fullName.lastIndexOf('.'); cName = fullName.substring(ix+1); targetClassName = pkg + "." + cName + "$Proxy" + nextId(); validateArgs(runtime, targetClassName, superClass); Type selfType = Type.getType("L" + toInternalClassName(targetClassName) + ";"); proxyClass = generate(loader, targetClassName, superClass, interfaces, collectMethods(superClass, interfaces, names), selfType);
private JavaProxyClass generate(ClassLoader loader, String targetClassName, Class superClass, Class[] interfaces, Map<MethodKey, MethodData> methods, Type selfType) { ClassWriter cw = beginProxyClass(targetClassName, superClass, interfaces); GeneratorAdapter clazzInit = createClassInitializer(selfType, cw); generateConstructors(superClass, selfType, cw); generateGetProxyClass(selfType, cw); generateGetInvocationHandler(selfType, cw); generateProxyMethods(superClass, methods, selfType, cw, clazzInit); // finish class initializer clazzInit.returnValue(); clazzInit.endMethod(); // end class cw.visitEnd(); Class clazz = invokeDefineClass(loader, selfType.getClassName(), cw.toByteArray()); // trigger class initialization for the class try { Field proxy_class = clazz.getDeclaredField(PROXY_CLASS_FIELD_NAME); proxy_class.setAccessible(true); return (JavaProxyClass) proxy_class.get(clazz); } catch (Exception ex) { InternalError ie = new InternalError(); ie.initCause(ex); throw ie; } }
private JavaProxyClass generate(ClassDefiningClassLoader loader, String targetClassName, Class superClass, Class[] interfaces, Map<MethodKey, MethodData> methods, Type selfType) { ClassWriter cw = beginProxyClass(targetClassName, superClass, interfaces, loader); GeneratorAdapter clazzInit = createClassInitializer(selfType, cw); generateConstructors(superClass, selfType, cw); generate___getProxyClass(selfType, cw); generate___getInvocationHandler(selfType, cw); generateProxyMethods(superClass, methods, selfType, cw, clazzInit); // finish class initializer clazzInit.returnValue(); clazzInit.endMethod(); // end class cw.visitEnd(); Class clazz = loader.defineClass(selfType.getClassName(), cw.toByteArray()); // trigger class initialization for the class try { Field proxy_class = clazz.getDeclaredField(PROXY_CLASS_FIELD_NAME); // proxy_class.setAccessible(true); // field is public return (JavaProxyClass) proxy_class.get(clazz); } catch (NoSuchFieldException|IllegalAccessException ex) { Helpers.throwException(ex); return null; // re-throws (although unexpected) } }
public JavaProxyClass newProxyClass(final Ruby runtime, ClassDefiningClassLoader loader, String targetClassName, Class superClass, Class[] interfaces, Set<String> names) throws InvocationTargetException { if (targetClassName == null) { targetClassName = targetClassName(superClass); } validateArgs(runtime, targetClassName, superClass); Type selfType = Type.getType('L' + toInternalClassName(targetClassName) + ';'); Map<MethodKey, MethodData> methods = collectMethods(superClass, interfaces, names); return generate(loader, targetClassName, superClass, interfaces, methods, selfType); }
private static Map<MethodKey, MethodData> collectMethods(Class superClass, Class[] interfaces, Set names) { Map<MethodKey, MethodData> methods = new HashMap<MethodKey, MethodData>(); HashSet allClasses = new HashSet(); addClass(allClasses, methods, superClass, names); addInterfaces(allClasses, methods, interfaces, names); return methods; }
private static void addInterface( final Set<Class> allClasses, final Map<MethodKey, MethodData> methods, final Class iface, final Set<String> names) { if ( allClasses.add(iface) ) { addMethods(methods, iface, names); addInterfaces(allClasses, methods, iface.getInterfaces(), names); } }
public static JavaProxyClassFactory createFactory() { JavaProxyClassFactory factory = null; if (PROXY_CLASS_FACTORY != null) { try { Class clazz = Class.forName(PROXY_CLASS_FACTORY); Object instance = clazz.newInstance(); if (instance instanceof JavaProxyClassFactory) { factory = (JavaProxyClassFactory) instance; LOG.info("Created proxy class factory: " + factory); } else { LOG.error("Invalid proxy class factory: " + instance); } } catch (ClassNotFoundException e) { LOG.error("ClassNotFoundException creating proxy class factory: " + e); } catch (InstantiationException e) { LOG.error("InstantiationException creating proxy class factory: " + e); } catch (IllegalAccessException e) { LOG.error("IllegalAccessException creating proxy class factory: " + e); } } if (factory == null) factory = new JavaProxyClassFactory(); return factory; }
public void load(Ruby runtime, boolean wrap) throws IOException { createJavaModule(runtime); RubyModule jpmt = runtime.defineModule("JavaPackageModuleTemplate"); jpmt.getSingletonClass().setSuperClass(new BlankSlateWrapper(runtime, jpmt.getMetaClass().getSuperClass(), runtime.getKernel())); runtime.getLoadService().require("jruby/java"); // rewite ArrayJavaProxy superclass to point at Object, so it inherits Object behaviors RubyClass ajp = runtime.getClass("ArrayJavaProxy"); ajp.setSuperClass(runtime.getJavaSupport().getObjectJavaClass().getProxyClass()); ajp.includeModule(runtime.getEnumerable()); RubyClassPathVariable.createClassPathVariable(runtime); runtime.setJavaProxyClassFactory(JavaProxyClassFactory.createFactory()); // modify ENV_JAVA to be a read/write version Map systemProps = new SystemPropertiesMap(); runtime.getObject().setConstantQuiet( "ENV_JAVA", new MapJavaProxy( runtime, (RubyClass)Java.getProxyClass(runtime, SystemPropertiesMap.class), systemProps)); }
private static void addClass(Set allClasses, Map methods, Class clazz, Set names) { if (allClasses.add(clazz)) { addMethods(methods, clazz, names); Class superClass = clazz.getSuperclass(); if (superClass != null) { addClass(allClasses, methods, superClass, names); } addInterfaces(allClasses, methods, clazz.getInterfaces(), names); } }