/** * Returns a Proxy that will redirect calls to the {@code javaProxy}, if possible. Alternatively, the * {@code target} is invoked. * * @param javaProxy The java proxy to invoke, if possible. * @param target The actual implementation to invoke if the javaProxy provides no method implementation * @return the proxy that will redirect the invocation to either the Java Proxy, or the target */ private Object createJavaProxyInvoker(Object javaProxy, Object target) { ProxyFactory pf = new ProxyFactory(target); pf.addAdvice(new ProxyOrImplementationInvocationInterceptor(javaProxy, target)); pf.setProxyTargetClass(true); pf.setExposeProxy(true); return pf.getProxy(target.getClass().getClassLoader()); }
protected Object createProxy(Object target, List<Advisor> advisors, Class<?>... interfaces) { ProxyFactory pf = new ProxyFactory(target); if (interfaces.length > 1 || interfaces[0].isInterface()) { pf.setInterfaces(interfaces); } else { pf.setProxyTargetClass(true); } // Required everywhere we use AspectJ proxies pf.addAdvice(ExposeInvocationInterceptor.INSTANCE); pf.addAdvisors(advisors); pf.setExposeProxy(true); return pf.getProxy(); }
@SuppressWarnings("unchecked") private I createAdapterProxy(Object annotatedHandler, final T adapter, final Class<?>[] adapterInterface, boolean proxyTargetClass, ClassLoader classLoader) { ProxyFactory pf = new ProxyFactory(annotatedHandler); for (Class<?> iClass : adapterInterface) { pf.addAdvice(new AdapterIntroductionInterceptor(adapter, iClass)); pf.addInterface(iClass); } pf.setProxyTargetClass(proxyTargetClass); pf.setExposeProxy(true); return (I) pf.getProxy(classLoader); }
private ITestBean getIntroductionAdvisorProxy(TestBean target) { ProxyFactory pf = new ProxyFactory(ITestBean.class); pf.setProxyTargetClass(true); pf.addAdvisor(new LockMixinAdvisor()); pf.setTarget(target); pf.setFrozen(true); pf.setExposeProxy(false); return (ITestBean) pf.getProxy(); }
private ITestBean getAdvisedProxy(TestBean target) { ProxyFactory pf = new ProxyFactory(new Class<?>[]{ITestBean.class}); pf.setProxyTargetClass(true); MethodInterceptor advice = new NopInterceptor(); Pointcut pointcut = new Pointcut() { @Override public ClassFilter getClassFilter() { return ClassFilter.TRUE; } @Override public MethodMatcher getMethodMatcher() { return MethodMatcher.TRUE; } @Override public boolean equals(Object obj) { return true; } @Override public int hashCode() { return 0; } }; pf.addAdvisor(new DefaultPointcutAdvisor(pointcut, advice)); pf.setTarget(target); pf.setFrozen(true); pf.setExposeProxy(false); return (ITestBean) pf.getProxy(); }
pf.setExposeProxy(true); pf.addAdvisor(ExposeInvocationInterceptor.ADVISOR); pf.addAdvice(new MethodBeforeAdvice() {
@Test public void testProxyIsBoundBeforeTargetSourceInvoked() { final TestBean target = new TestBean(); ProxyFactory pf = new ProxyFactory(target); pf.addAdvice(new DebugInterceptor()); pf.setExposeProxy(true); final ITestBean proxy = (ITestBean) createProxy(pf); Advised config = (Advised) proxy; // This class just checks proxy is bound before getTarget() call config.setTargetSource(new TargetSource() { @Override public Class<?> getTargetClass() { return TestBean.class; } @Override public boolean isStatic() { return false; } @Override public Object getTarget() throws Exception { assertEquals(proxy, AopContext.currentProxy()); return target; } @Override public void releaseTarget(Object target) throws Exception { } }); // Just test anything: it will fail if context wasn't found assertEquals(0, proxy.getAge()); }
ProxyFactory pf1 = new ProxyFactory(target1); pf1.setExposeProxy(true); NopInterceptor di1 = new NopInterceptor(); pf1.addAdvice(0, di1); pf2.setExposeProxy(true); NopInterceptor di2 = new NopInterceptor(); pf2.addAdvice(0, di2);
@Test public void testTargetCanGetProxy() { NopInterceptor di = new NopInterceptor(); INeedsToSeeProxy target = new TargetChecker(); ProxyFactory proxyFactory = new ProxyFactory(target); proxyFactory.setExposeProxy(true); assertTrue(proxyFactory.isExposeProxy()); proxyFactory.addAdvice(0, di); INeedsToSeeProxy proxied = (INeedsToSeeProxy) createProxy(proxyFactory); assertEquals(0, di.getCount()); assertEquals(0, target.getCount()); proxied.incrementViaThis(); assertEquals("Increment happened", 1, target.getCount()); assertEquals("Only one invocation via AOP as use of this wasn't proxied", 1, di.getCount()); // 1 invocation assertEquals("Increment happened", 1, proxied.getCount()); proxied.incrementViaProxy(); // 2 invocations assertEquals("Increment happened", 2, target.getCount()); assertEquals("3 more invocations via AOP as the first call was reentrant through the proxy", 4, di.getCount()); }
pf.setProxyTargetClass(true); pf.setOptimize(true); pf.setExposeProxy(false); pf.setFrozen(true); pf.setAopProxyFactory(new DefaultAopProxyFactory());
/** */ public HibernateBeanSerializer(T object,String... excludesProperties) { if(object == null) { this.proxy = null; }else { ProxyFactory pf = new ProxyFactory(); pf.setTargetClass(object.getClass()); pf.setOptimize(true); pf.setTarget(object); pf.setProxyTargetClass(true); pf.setOpaque(true); pf.setExposeProxy(true); pf.setPreFiltered(true); pf.setInterfaces(new Class[]{HibernateBeanSerializerProxy.class}); HibernateBeanSerializerAdvice beanSerializerAdvice = new HibernateBeanSerializerAdvice(); beanSerializerAdvice.setExcludesProperties(excludesProperties); pf.addAdvice(beanSerializerAdvice); this.proxy = (T)pf.getProxy(); } }