1、ProxyFactory.java
package com.ats.proxy; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.util.ArrayList; import java.util.List; public class ProxyFactory implements InvocationHandler{ 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) { return java.lang.reflect.Proxy.newProxyInstance(invoker.getClass().getClassLoader(), invoker.getClass().getInterfaces(), new ProxyFactory(invoker,interceptors)); } @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { Object result = null; for(Object o : interceptors) { if(o instanceof IProxyBefore) { ((IProxyBefore)o).BeforeInvoke(); } } try { result = method.invoke(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
package com.ats.proxy; public interface IProxyThrow { public void ThrowInvoke(); }
6、ICarFactory.java
package com.ats.test; public interface ICarFactory { public Car NewCar(); }
7、Car.java
package com.ats.test; public class Car { public Car() { System.out.println("This is a new Car"); } }
8、IProxyBefore.java
package com.ats.test; import com.ats.proxy.IProxyBefore; public class CarFactoryBefore implements IProxyBefore{ @Override public void BeforeInvoke() { System.out.println("CarFactoryBefore BeforeInvoke"); } }
9、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"); } }
10、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"); } }
11、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"); } }
12、CarFactory.java
package com.ats.test; import java.util.ArrayList; import java.util.List; import com.ats.proxy.IProxyAround; import com.ats.proxy.IProxyThrow; import com.ats.proxy.ProxyFactory; public class CarFactory implements ICarFactory { 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); ICarFactory factory = (ICarFactory)ProxyFactory.newInstance(fac,l); factory.NewCar(); } }