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