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();
}
}