/*** @author wjj* @date 2021/3/1 14:12*/public class ProxyDemo {public static void main(String[] args) {SeniorLawyer seniorLawyer = new SeniorLawyer();Lawyer l = (Lawyer)Proxy.newProxyInstance(seniorLawyer.getClass().getClassLoader(), seniorLawyer.getClass().getInterfaces(), (proxy, method, args1) -> {if ("goToCourt".equals(method.getName())){System.out.println("准备材料");method.invoke(seniorLawyer, args1);}return null;});l.goToCourt();}interface Lawyer {void goToCourt();}static class SeniorLawyer implements Lawyer{@Overridepublic void goToCourt() {System.out.println("totally win!");}}}

- 参数一:生成代理对象使用哪个类装载器【一般我们使用的是被代理类的装载器】
- 参数二:生成哪个对象的代理对象,通过接口指定【指定要被代理类的接口】
参数三:生成的代理对象的方法里干什么事【实现handler接口,我们想怎么实现就怎么实现】
代理对象拥有目标对象相同的方法【因为参数二指定了对象的接口,代理对象会实现接口的所有方法】
- 用户调用代理对象的什么方法,都是在调用处理器的invoke方法。【被拦截】
- 使用JDK动态代理必须要有接口【参数二需要接口】
要实现动态代理必须要有接口的,动态代理是基于接口来代理的(实现接口的所有方法),如果没有接口的话我们可以考虑cglib代理。
cglib代理也叫子类代理,从内存中构建出一个子类来扩展目标对象的功能!
代理模式是我们写代码中用得很多的一种模式了,Spring的AOP底层其实就是动态代理来实现的—>面向切面编程
其实只要记住一点:原有的对象需要额外的功能,想想动态代理这项技术!
