JDK和CGLIB动态代理实践
首先准备一个接口,一个实现类:
package zhangbin.aop;
/**
* @author bin.zhang
* @version 2017年9月8日 上午10:05:45
*/
public interface UserManager {
public int addUser(String id, String password);
}
package zhangbin.aop;
/**
* @author bin.zhang
* @version 2017年9月8日 上午10:06:22
*/
public class UserManagerImpl implements UserManager {
public int addUser(String id, String password) {
System.out.println("调用了UserManagerImpl.addUser()方法! ");
return 0;
}
}
JDKProxy.java代理类:
package zhangbin.aop;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
/**
* @author bin.zhang
* @version 2017年9月8日 上午10:07:02
*/
public class JDKProxy implements InvocationHandler {
// 需要代理的目标对象
private Object targetObject;
/**
* 将目标对象传入进行代理,返回代理对象
*
* @author bin.zhang
* @param targetObject
* @return
*/
public Object newProxy(Object targetObject) {
this.targetObject = targetObject;
return Proxy.newProxyInstance(targetObject.getClass().getClassLoader(), targetObject.getClass().getInterfaces(), this);
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
checkPopedom();// 一般我们进行逻辑处理的函数比如这个地方是模拟检查权限
Object ret = null; // 设置方法的返回值
ret = method.invoke(targetObject, args); // 调用invoke方法,ret存储该方法的返回值
return ret;
}
/**
* 检查权限,在调用UserManagerImpl中的方法前执行
*
* @author bin.zhang
*/
private void checkPopedom() {
System.out.println(".:检查权限 checkPopedom()!");
}
}
CGLibProxy.java代理类:
package zhangbin.aop;
import java.lang.reflect.Method;
import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;
/**
* @author bin.zhang
* @version 2017年9月8日 上午10:08:29
*/
public class CGLibProxy implements MethodInterceptor {
// CGLib需要代理的目标对象
private Object targetObject;
/**
* 创建代理对象
*
* @author bin.zhang
* @param obj
* @return 代理对象
*/
public Object createProxyObject(Object obj) {
this.targetObject = obj;
Enhancer enhancer = new Enhancer();
enhancer.setSuperclass(obj.getClass());
enhancer.setCallback(this);
Object proxyObj = enhancer.create();
return proxyObj;
}
@Override
public Object intercept(Object proxy, Method method, Object[] args,
MethodProxy methodProxy) throws Throwable {
Object obj = null;
if ("addUser".equals(method.getName())) {// 过滤方法
checkPopedom();// 检查权限
}
obj = method.invoke(targetObject, args);
return obj;
}
private void checkPopedom() {
System.out.println(".:检查权限 checkPopedom()!");
}
}
Client.java测试类:
package zhangbin.aop;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;
/**
* @author bin.zhang
* @version 2017年9月8日 上午10:09:48
*/
public class Client {
public static void main(String[] args) {
System.out.println("-----------方式一-----------");
System.out.println("测试CGLibProxy:");
UserManager userManager = (UserManager) new CGLibProxy().createProxyObject(new UserManagerImpl());
userManager.addUser("Kobe", "24");
System.out.println("测试JDKProxy:");
JDKProxy jdkPrpxy = new JDKProxy();
UserManager userManagerJDK = (UserManager) jdkPrpxy.newProxy(new UserManagerImpl());
userManagerJDK.addUser("LeBron", "23");
System.out.println("\n\n");
System.out.println("-----------方式二-----------");
UserManagerImpl umi = new UserManagerImpl();
System.out.println("测试CGLibProxy:");
Enhancer enhancer = new Enhancer();
enhancer.setSuperclass(umi.getClass());
enhancer.setCallback(new MethodInterceptor() {
@Override
public Object intercept(Object arg0, Method arg1, Object[] arg2, MethodProxy arg3) throws Throwable {
System.out.println("start cglib proxy...");
Object rst = arg1.invoke(umi, arg2);
System.out.println("end cglib proxy...");
return rst;
}
});
UserManager objCglib = (UserManager) enhancer.create();
System.out.println(objCglib.addUser("tim", "duck"));
System.out.println("测试JDKProxy:");
UserManager obj = (UserManager) Proxy.newProxyInstance(umi.getClass().getClassLoader(), umi.getClass().getInterfaces(), new InvocationHandler() {
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("start jdk proxy...");
Object rst = method.invoke(umi, args);
System.out.println("end jdk proxy...");
return rst;
}
});
System.out.println(obj.addUser("tom", "root"));
}
}
运行结果: