AOP本质:在不修改源代码的情况下添加功能。
动态代理使用的的两个类 Proxy和InvocationHandle
Proxy用于生成动态代理类
InvocationHandle用户处理代理实例,并返回结果
import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy; public class ProxyInvocationHandle 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 { before(); Object invoke = method.invoke(target, args); after(); return invoke; } public void before(){ System.out.println("添加执行代码之前的逻辑"); } public void after(){ System.out.println("添加执行代码之后的逻辑"); } }
public class Test { public static void main(String[] args) { UserService userService = new UserServiceImpl();// 实例化需要被代理的对象 ProxyInvocationHandle proxyInvocationHandle = new ProxyInvocationHandle();// 实例化代理对象 proxyInvocationHandle.setTarget(userService); // 注入需要代理的对象 UserService proxy = (UserService) proxyInvocationHandle.getProxy();// 获取代理的对象 proxy.getUserById(1); // 执行被代理之后的方法 } }