1、ProxyFactory.java
package com.ats.proxy; import java.lang.reflect.Method; import java.util.ArrayList; import java.util.List; import net.sf.cglib.proxy.Enhancer; import net.sf.cglib.proxy.MethodInterceptor; import net.sf.cglib.proxy.MethodProxy; public class ProxyFactory implements MethodInterceptor{ //private Object invoker; private List<Object> interceptors; private ProxyFactory(Object invoker,List<Object> interceptors) { //this.invoker = invoker; if(interceptors==null) { this.interceptors = new ArrayList<Object>(); } else { this.interceptors = interceptors; } } public static final Object newInstance(Object invoker,List<Object> interceptors) { Enhancer enhancer = new Enhancer(); enhancer.setSuperclass(invoker.getClass()); enhancer.setCallback(new ProxyFactory(invoker,interceptors)); return enhancer.create(); } @Override public Object intercept(Object invoker, Method method, Object[] args, MethodProxy proxy) throws Throwable { Object result = null; for(Object o : interceptors) { if(o instanceof IProxyBefore) { ((IProxyBefore)o).BeforeInvoke(); } } try { result = proxy.invokeSuper(invoker, args); } catch(Exception ex) { for(Object o : interceptors) { if(o instanceof IProxyThrow) { ((IProxyThrow)o).ThrowInvoke(); } } } for(Object o : interceptors) { if(o instanceof IProxyAfter) { ((IProxyAfter)o).AfterInvoke(); } } return result; } }
2、IProxyBefore.java
package com.ats.proxy; public interface IProxyBefore { public void BeforeInvoke(); }
3、IProxyAfter.java
package com.ats.proxy; public interface IProxyAfter { public void AfterInvoke(); }
4、IProxyAround.java
package com.ats.proxy; public interface IProxyAround extends IProxyBefore,IProxyAfter{ }
5、IProxyThrow.java
[code lang="java"] package com.ats.proxy; public interface IProxyThrow { public void ThrowInvoke(); }
6、Car.java
package com.ats.test; public class Car { public Car() { System.out.println("This is a new Car"); } }
7、CarFactoryBefore.java
package com.ats.test; import com.ats.proxy.IProxyBefore; public class CarFactoryBefore implements IProxyBefore{ @Override public void BeforeInvoke() { System.out.println("CarFactoryBefore BeforeInvoke"); } }
8、CarFactoryAfter.java
package com.ats.test; import com.ats.proxy.IProxyAfter; public class CarFactoryAfter implements IProxyAfter { @Override public void AfterInvoke() { System.out.println("CarFactoryAfter AfterInvoke"); } }
9、CarFactoryAround.java
package com.ats.test; import com.ats.proxy.IProxyAround; public class CarFactoryAround implements IProxyAround{ @Override public void AfterInvoke() { System.out.println("CarFactoryAround AfterInvoke"); } @Override public void BeforeInvoke() { System.out.println("CarFactoryAround BeforeInvoke"); } }
10、CarFactoryThrow.java
package com.ats.test; import com.ats.proxy.IProxyThrow; public class CarFactoryThrow implements IProxyThrow { @Override public void ThrowInvoke() { System.out.println("CarFactory ThrowInvoke"); } }
11、ProxyFactory.java
package com.ats.test; import java.util.ArrayList; import java.util.List; import com.ats.proxy.ProxyFactory; public class CarFactory{ public Car NewCar() { return new Car(); } public static void main(String[] args) { CarFactory fac = new CarFactory(); CarFactoryAfter after = new CarFactoryAfter(); CarFactoryBefore before = new CarFactoryBefore(); CarFactoryAround around = new CarFactoryAround(); CarFactoryThrow _throw = new CarFactoryThrow(); List<Object> l = new ArrayList<Object>(); l.add(after); l.add(before); l.add(around); l.add(_throw); CarFactory fac1=(CarFactory)ProxyFactory.newInstance(fac, l); fac1.NewCar(); } }