版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Michaeles/article/details/85415009
一、基于jdk动态代理模拟权限检查
1.JDKProxy.java
public class JDKProxy implements InvocationHandler {
private Object targetObject;//需要代理的目标对象
/*
* 创建动态代理,通过反射来实例化目标对象
*/
public Object newProxy(Object targetObject) {//将目标对象传入进行代理
this.targetObject = targetObject;
/* (被代理对象的类加载器,被代理对象所有的类接口,被代理对象)*/
return Proxy.newProxyInstance(targetObject.getClass().getClassLoader(),
targetObject.getClass().getInterfaces(), this);//返回代理对象
}
/*
*反射知识
*invoke(代理的真实对象、代理的方法、方法中接收的参数)
*invoke:简单理解就是在不知道对象的前提下,通过配置的参数来调用方法。
*/
public Object invoke(Object proxy, Method method, Object[] args)throws Throwable {
//一般我们进行逻辑处理的函数比如这个地方是模拟检查权限
checkPopedom();
Object ret = null;// 设置方法的返回值
ret = method.invoke(targetObject, args);
//调用invoke方法,通过反射机制来运行目标对象的方法,赋值给ret
return ret;
}
private void checkPopedom() {//模拟检查权限的例子
System.out.println("JDK动态代理类 检查权限 checkPopedom()!");
}
}
2.UserManager.java
public interface UserManager {
public void addUser(String id, String password);
public void delUser(String id);
}
public class UserManagerImpl implements UserManager {
public void addUser(String id, String password) {
System.out.println("掉用了UserManagerImpl.addUser()方法! ");
}
public void delUser(String id) {
System.out.println("掉用了UserManagerImpl.delUser()方法! ");
}
}
3.测试类
public class Client {
public static void main(String[] args) {
System.out.println("-----------JDKProxy-------------");
JDKProxy jdkPrpxy = new JDKProxy();
UserManager userManagerJDK = (UserManager) jdkPrpxy.newProxy(new UserManagerImpl());//创建动态代理对象
userManagerJDK.addUser("tom", "root");//调用方法前先调用revoke方法
}
}
二、cglib实现
1.CGLibProxy.java
public class CGLibProxy implements MethodInterceptor {
private Object targetObject;// CGLib需要代理的目标对象
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;// 返回代理对象
}
/*
*invoke()调用类中的方法
*
*/
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("调用CGLib进行检查权限 checkPopedom()!");
}
}
2.测试代码
public class Client {
public static void main(String[] args) {
UserManager userManager = (UserManager) new CGLibProxy().createProxyObject(new UserManagerImpl());
System.out.println("-----------CGLibProxy-------------");
//调用方法前先调用revoke方法
userManager.addUser("tom", "root");
}
}
总结:每次执行方法前都会调用检查权限那个方法。