手写aop
package com.demo; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy; // 测试接口和类 interface Waiter { //服务方法 public void server(); } class ManWaiter implements Waiter { @Override public void server() { System.out.println("服务中"); } } // aop框架 interface BeforeAdvice { public void before(); } interface AfterAdvice { public void after(); } /** * @author sunwenfei * @date 2021-08-13 14:00 */ public class ProxyFactory { private Object targetObject;//目标对象 private BeforeAdvice beforeAdvice;//前值增强 private AfterAdvice afterAdvice;//后置增强 public Object getTargetObject() { return targetObject; } public void setTargetObject(Object targetObject) { this.targetObject = targetObject; } public BeforeAdvice getBeforeAdvice() { return beforeAdvice; } public void setBeforeAdvice(BeforeAdvice beforeAdvice) { this.beforeAdvice = beforeAdvice; } public AfterAdvice getAfterAdvice() { return afterAdvice; } public void setAfterAdvice(AfterAdvice afterAdvice) { this.afterAdvice = afterAdvice; } /** * 用来生成代理对象 * @return */ public Object creatProxy() { /** * 给出三个参数 */ ClassLoader classLoader = this.getClass().getClassLoader(); //获取当前类型所实现的所有接口类型 Class[] interfaces = targetObject.getClass().getInterfaces(); InvocationHandler invocationHandler = new InvocationHandler() { @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { /** * 在调用代理对象的方法时,会执行这里的内容 */ if(beforeAdvice != null) { beforeAdvice.before(); } Object result = method.invoke(targetObject, args);//调用目标对象的目标方法 //执行后续增强 afterAdvice.after(); //返回目标对象的返回值 return result; } }; /** * 2、得到代理对象 */ Object proxyObject = Proxy.newProxyInstance(classLoader, interfaces, invocationHandler); return proxyObject; } public static void main(String[] args) { ProxyFactory proxyFactory = new ProxyFactory();//创建工厂 proxyFactory.setTargetObject(new ManWaiter());//设置目标对象 //设置前置增强 proxyFactory.setBeforeAdvice(new BeforeAdvice() { @Override public void before() { System.out.println("客户你好"); } }); //设置后置增强 proxyFactory.setAfterAdvice(new AfterAdvice() { @Override public void after() { System.out.println("客户再见"); } }); Waiter waiter = (Waiter) proxyFactory.creatProxy(); waiter.server(); } }
https://zhuanlan.zhihu.com/p/37732577