/** * Defines class or interface to wrap. * For setting the interface of the resulting class, * use {@link #setTargetInterface(Class)}. */ @Override public WrapperProxettaFactory setTarget(final Class target) { super.setTarget(target); this.targetClassOrInterface = target; return this; }
/** * Creates new instance of created class. * Assumes default no-arg constructor. */ public Object newInstance() { Class type = define(); try { return ClassUtil.newInstance(type); } catch (Exception ex) { throw new ProxettaException("Invalid Proxetta class", ex); } }
/** * Defines class input stream as a target. */ protected T setTarget(final InputStream target) { assertTargetIsNotDefined(); targetInputStream = target; targetClass = null; targetClassName = null; return _this(); }
/** * Returns byte array of created class. */ public byte[] create() { process(); byte[] result = toByteArray(); dumpClassInDebugFolder(result); if ((!proxetta.isForced()) && (!isProxyApplied())) { if (log.isDebugEnabled()) { log.debug("Proxy not applied: " + StringUtil.toSafeString(targetClassName)); } return null; } if (log.isDebugEnabled()) { log.debug("Proxy created " + StringUtil.toSafeString(targetClassName)); } return result; }
/** * Applies proxetta on bean class before bean registration. */ @SuppressWarnings("unchecked") @Override protected <T> BeanDefinition<T> createBeanDefinitionForRegistration( final String name, Class<T> type, final Scope scope, final WiringMode wiringMode, final Consumer<T> consumer) { if (proxetta != null) { final Class originalType = type; final ProxettaFactory builder = proxetta.proxy(); builder.setTarget(type); type = builder.define(); return new ProxettaBeanDefinition( name, type, scope, wiringMode, originalType, proxetta.getAspects(new ProxyAspect[0]), consumer); } return super.createBeanDefinitionForRegistration(name, type, scope, wiringMode, consumer); }
@Test void testMethodAnnotationsProxy() { ProxyProxetta proxetta = Proxetta .proxyProxetta() .withAspect( ProxyAspect.of(HeroProxyAdvice.class, ((ProxyPointcut) MethodInfo::isTopLevelMethod).and(AllRealMethodsPointcut.get()) )) //.setDebugFolder(FileUtil.file("~")) ; ProxettaFactory proxettaFactory = proxetta.proxy(); proxettaFactory.setTarget(Hero.class); proxetta.setVariableClassName(true); Hero hero = (Hero) proxettaFactory.newInstance(); assertEquals("BatmanHero37W88.3CatWoman99speeeeedXRAYnull", hero.name()); }
/** * Returns proxy class name. */ public String getProxyClassName() { assertProxyIsCreated(); return proxyClassName; }
/** * Sets requested proxy class name. */ public T setTargetProxyClassName(final String targetProxyClassName) { this.requestedProxyClassName = targetProxyClassName; return _this(); }
/** * Reads the target and creates destination class. */ protected void process() { if (targetInputStream == null) { throw new ProxettaException("Target missing: " + targetClassName); } // create class reader final ClassReader classReader; try { classReader = new ClassReader(targetInputStream); } catch (IOException ioex) { throw new ProxettaException("Error reading class input stream", ioex); } // reads information final TargetClassInfoReader targetClassInfoReader = new TargetClassInfoReader(proxetta.getClassLoader()); classReader.accept(targetClassInfoReader, 0); this.destClassWriter = new ClassWriter(ClassWriter.COMPUTE_MAXS | ClassWriter.COMPUTE_FRAMES); // create proxy if (log.isDebugEnabled()) { log.debug("processing: " + classReader.getClassName()); } WorkData wd = process(classReader, targetClassInfoReader); // store important data proxyApplied = wd.proxyApplied; proxyClassName = wd.thisReference.replace('/', '.'); }
process(); if ((!proxetta.isForced()) && (!isProxyApplied())) { if (log.isDebugEnabled()) { log.debug("Proxy not applied: " + StringUtil.toSafeString(targetClassName)); final byte[] bytes = toByteArray(); dumpClassInDebugFolder(bytes); return DefineClass.of(getProxyClassName(), bytes, classLoader); } catch (Exception ex) { throw new ProxettaException("Class definition failed", ex);
@Test void testClassAnnotationsProxy() { ProxyProxetta proxetta = Proxetta .proxyProxetta() .withAspect( new ProxyAspect(HeroProxyAdvice2.class, ((ProxyPointcut) MethodInfo::isTopLevelMethod).and(AllRealMethodsPointcut.get()) )) //.setDebugFolder("/Users/igor/") ; ProxettaFactory proxettaFactory = proxetta.proxy(); proxettaFactory.setTarget(Hero.class); proxetta.setVariableClassName(true); Hero hero = (Hero) proxettaFactory.newInstance(); assertEquals("SilverHero89W99.222None1000speeeeedXRAYnull", hero.name()); }
/** * Returns <code>true</code> if at least one method was wrapped. */ public boolean isProxyApplied() { assertProxyIsCreated(); return proxyApplied; }
/** * Sets requested proxy class name. */ public T setTargetProxyClassName(final String targetProxyClassName) { this.requestedProxyClassName = targetProxyClassName; return _this(); }
/** * Reads the target and creates destination class. */ protected void process() { if (targetInputStream == null) { throw new ProxettaException("Target missing: " + targetClassName); } // create class reader final ClassReader classReader; try { classReader = new ClassReader(targetInputStream); } catch (IOException ioex) { throw new ProxettaException("Error reading class input stream", ioex); } // reads information final TargetClassInfoReader targetClassInfoReader = new TargetClassInfoReader(proxetta.getClassLoader()); classReader.accept(targetClassInfoReader, 0); this.destClassWriter = new ClassWriter(ClassWriter.COMPUTE_MAXS | ClassWriter.COMPUTE_FRAMES); // create proxy if (log.isDebugEnabled()) { log.debug("processing: " + classReader.getClassName()); } WorkData wd = process(classReader, targetClassInfoReader); // store important data proxyApplied = wd.proxyApplied; proxyClassName = wd.thisReference.replace('/', '.'); }
@Override public ProxyProxettaFactory setTarget(final InputStream target) { return super.setTarget(target); }
/** * Returns byte array of created class. */ public byte[] create() { process(); byte[] result = toByteArray(); dumpClassInDebugFolder(result); if ((!proxetta.isForced()) && (!isProxyApplied())) { if (log.isDebugEnabled()) { log.debug("Proxy not applied: " + StringUtil.toSafeString(targetClassName)); } return null; } if (log.isDebugEnabled()) { log.debug("Proxy created " + StringUtil.toSafeString(targetClassName)); } return result; }
/** * Applies proxetta on bean class before bean registration. */ @SuppressWarnings("unchecked") @Override protected <T> BeanDefinition<T> createBeanDefinitionForRegistration( final String name, Class<T> type, final Scope scope, final WiringMode wiringMode, final Consumer<T> consumer) { if (proxetta != null) { final Class originalType = type; final ProxettaFactory builder = proxetta.proxy(); builder.setTarget(type); type = builder.define(); return new ProxettaBeanDefinition( name, type, scope, wiringMode, originalType, proxetta.getAspects(new ProxyAspect[0]), consumer); } return super.createBeanDefinitionForRegistration(name, type, scope, wiringMode, consumer); }
/** * Defines class as a target. */ public T setTarget(final Class target) { assertTargetIsNotDefined(); try { targetInputStream = ClassLoaderUtil.getClassAsStream(target); if (targetInputStream == null) { throw new ProxettaException("Target class not found: " + target.getName()); } targetClass = target; targetClassName = target.getName(); } catch (IOException ioex) { StreamUtil.close(targetInputStream); throw new ProxettaException("Unable to stream class: " + target.getName(), ioex); } return _this(); }
/** * Creates new instance of created class. * Assumes default no-arg constructor. */ public Object newInstance() { Class type = define(); try { return ClassUtil.newInstance(type); } catch (Exception ex) { throw new ProxettaException("Invalid Proxetta class", ex); } }