UserServiceBean.java //interface
/**
*
*/
package cn.aop.service;
/**
* @author
*
*/
public interface UserServiceBean {
public void add();
}
UserSerivce.java //implement UserServiceBean
/**
*
*/
package cn.aop.service;
/**
* @author
*
*/
public class UserSerivce implements UserServiceBean {
private String user;
public UserSerivce() {
}
public UserSerivce(String user) {
this.user = user;
}
public String getUser() {
return user;
}
public void setUser(String user) {
this.user = user;
}
/**
*
*/
@Override
public void add() {
System.out.println("add");
}
}
JDKProxyFactory.java //jdk proxy
/**
*
*/
package cn.aop.proxy;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import cn.aop.service.UserSerivce;
/**
* @author
*
*/
public class JDKProxyFactory implements InvocationHandler {
private Object proxyObject;
/**
* 拦截所有方法
* @param obj
* @return
*/
public Object createProxObject(Object obj){
this.proxyObject=obj;
return Proxy.newProxyInstance(proxyObject.getClass().getClassLoader(), proxyObject.getClass().getInterfaces(), this);
}
/**
*根据user为不为空,来invoke特定的方法
*/
@Override
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
UserSerivce userSerivce=(UserSerivce)this.proxyObject;
Object result=null;
if(userSerivce.getUser()!=null){
result=method.invoke(this.proxyObject,args);
}
return result;
}
}
CGLIBProxyFactory.java //cglib proxy
/**
*
*/
package cn.cglib;
import java.lang.reflect.Method;
import cn.aop.service.UserSerivce;
import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;
/**
* @author
*
*/
public class CGLIBProxyFactory implements MethodInterceptor {
private Object targerObject;
/**
* 拦截所有方法
* @param obj
* @return
*/
public Object createProxObject(Object targerObject) {
this.targerObject = targerObject;
Enhancer enhancer=new Enhancer();
enhancer.setSuperclass(this.targerObject.getClass());
enhancer.setCallback(this);
return enhancer.create();
}
/**
*根据user为不为空,来invoke特定的方法
*/
@Override
public Object intercept(Object targerObject, Method method, Object[] args,
MethodProxy arg3) throws Throwable {
UserSerivce userSerivce=(UserSerivce)this.targerObject;
Object result=null;
if(userSerivce.getUser()!=null){
result=method.invoke(this.targerObject,args);
}
return result;
}
}
ProxyTest.java //junit test
package junit.test;
import org.junit.BeforeClass;
import org.junit.Test;
import cn.aop.proxy.JDKProxyFactory;
import cn.aop.service.UserSerivce;
import cn.aop.service.UserServiceBean;
import cn.cglib.CGLIBProxyFactory;
public class ProxyTest {
@BeforeClass
public static void setUpBeforeClass() throws Exception {
}
@Test public void JDKProxyFactoryTest(){
JDKProxyFactory proxy=new JDKProxyFactory();
UserServiceBean userBean=(UserServiceBean)proxy.createProxObject(new UserSerivce("xxx"));
userBean.add();
}
@Test public void CGLIBProxyFactoryTest(){
CGLIBProxyFactory proxy=new CGLIBProxyFactory();
UserServiceBean userBean=(UserServiceBean)proxy.createProxObject(new UserSerivce(null));
userBean.add();
}
}