/** * Returns a classloader for loading the proxy class, creating one if necessary. * * @param type the type to generate a classloader for * @return the classloader */ private BytecodeClassLoader getClassLoader(Class<?> type) { ClassLoader parent = type.getClassLoader(); ClassLoader extensionClassLoader = getClass().getClassLoader(); BytecodeClassLoader classLoader = new BytecodeClassLoader(URI.create("BytecodeClassLoader"), parent); classLoader.addParent(extensionClassLoader); // proxy classes need to be visible as well return classLoader; }
/** * Returns a classloader for loading the proxy class, creating one if necessary. * * @param type the type to generate a classloader for * @return the classloader */ private BytecodeClassLoader getClassLoader(Class<?> type) { ClassLoader parent = type.getClassLoader(); ClassLoader extensionClassLoader = getClass().getClassLoader(); BytecodeClassLoader classLoader = new BytecodeClassLoader(URI.create("BytecodeClassLoader"), parent); classLoader.addParent(extensionClassLoader); // proxy classes need to be visible as well return classLoader; }
@SuppressWarnings("unchecked") public <T> Class<? extends T> generate(Class<T> baseClass, Class<?> delegateClass, String genericSignature) { ClassWriter cw = new ClassWriter(0); int number = counter.getAndIncrement(); byte[] bytes = writeClass(cw, baseClass, delegateClass, genericSignature, number); String generatedName = baseClass.getName() + SUFFIX + "_" + number; BytecodeClassLoader bytecodeClassLoader = new BytecodeClassLoader(URI.create("BytecodeClassLoader"), getClass().getClassLoader()); bytecodeClassLoader.addParent(delegateClass.getClassLoader()); return (Class<? extends T>) bytecodeClassLoader.defineClass(generatedName, bytes); }
@SuppressWarnings("unchecked") public <T> Class<? extends T> generate(Class<T> baseClass, Class<?> delegateClass, String genericSignature) { ClassWriter cw = new ClassWriter(0); int number = counter.getAndIncrement(); byte[] bytes = writeClass(cw, baseClass, delegateClass, genericSignature, number); String generatedName = baseClass.getName() + SUFFIX + "_" + number; BytecodeClassLoader bytecodeClassLoader = new BytecodeClassLoader(URI.create("BytecodeClassLoader"), getClass().getClassLoader()); bytecodeClassLoader.addParent(delegateClass.getClassLoader()); return (Class<? extends T>) bytecodeClassLoader.defineClass(generatedName, bytes); }