分为静态代理和动态代理。将原有业务代码不变更作为原则,通过代理类来实现对原有业务的功能扩展。
使用动态代理解决静态代理需要手写多个代理类应对不同业务的情况
package ProxyDemo; public interface UserService { void add(); void delete(); void update(); void query(); }
package ProxyDemo; /** * @Description: 接口实现类 * @author: HardyDragon * @date: 2021年07月14日 16:31 */ public class UserServiceImpl implements UserService { @Override public void add() { System.out.println("add succ"); } @Override public void delete() { System.out.println("delete succ"); } @Override public void update() { System.out.println("update succ"); } @Override public void query() { System.out.println("query succ"); } }
利用 Proxy类生成代理实例,传入
loader – 定义代理类的类加载器(反射有关知识点)
接口 - 代理类要实现的接口列表
h – 将方法调用分派到的调用处理程序
返回:
具有代理类的指定调用处理程序的代理实例,该代理类由指定的类加载器定义并实现指定的接口
package ProxyDemo; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy; /** * @Description: 利用 Proxy 和 实现 InvocationHandler 接口重写 invoke 方法,实现设置生成动态代理类 * @author: HardyDragon * @date: 2021年07月14日 16:22 */ public class ProxyInvocationHandler implements InvocationHandler { // 要被代理的接口 private Object target; // 设置要被代理的接口 public void setTarget(Object target) { this.target = target; } // 获取生成的动态代理类 public Object getProxy() { return Proxy.newProxyInstance(this.getClass().getClassLoader(), target.getClass().getInterfaces(), this); } // 处理代理实例 额外操作 @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { log(method.getName()); Object res = method.invoke(target, args); return res; } // 通过代理类添加额外的业务 public void log(String msg) { System.out.println("[Debug]执行了" + msg + "方法!"); } }
package ProxyDemo; /** * @Description: 使用动态代理解决静态代理 需要手写多个代理类应对不同业务的情况 * @author: HardyDragon * @date: 2021年07月14日 16:30 */ public class Client { public static void main(String[] args) { // 真实对象,要被代理的对象,纯粹的业务 UserServiceImpl userService = new UserServiceImpl(); // 动态生成的代理类 ProxyInvocationHandler pih = new ProxyInvocationHandler(); // 给代理类设置要代理的对象 pih.setTarget(userService); // 得到生成的代理类 UserService proxy = (UserService) pih.getProxy(); proxy.add(); proxy.delete(); proxy.update(); proxy.query(); } }
result
[Debug]执行了add方法! add succ [Debug]执行了delete方法! delete succ [Debug]执行了update方法! update succ [Debug]执行了query方法! query succ Process finished with exit code 0