1. /**
    2. * @author wjj
    3. * @date 2021/3/1 14:12
    4. */
    5. public class ProxyDemo {
    6. public static void main(String[] args) {
    7. SeniorLawyer seniorLawyer = new SeniorLawyer();
    8. Lawyer l = (Lawyer)Proxy.newProxyInstance(seniorLawyer.getClass().getClassLoader(), seniorLawyer.getClass().getInterfaces(), (proxy, method, args1) -> {
    9. if ("goToCourt".equals(method.getName())){
    10. System.out.println("准备材料");
    11. method.invoke(seniorLawyer, args1);
    12. }
    13. return null;
    14. });
    15. l.goToCourt();
    16. }
    17. interface Lawyer {
    18. void goToCourt();
    19. }
    20. static class SeniorLawyer implements Lawyer{
    21. @Override
    22. public void goToCourt() {
    23. System.out.println("totally win!");
    24. }
    25. }
    26. }

    image.png

    • 参数一:生成代理对象使用哪个类装载器【一般我们使用的是被代理类的装载器】
    • 参数二:生成哪个对象的代理对象,通过接口指定【指定要被代理类的接口】
    • 参数三:生成的代理对象的方法里干什么事【实现handler接口,我们想怎么实现就怎么实现】

    • 代理对象拥有目标对象相同的方法【因为参数二指定了对象的接口,代理对象会实现接口的所有方法】

    • 用户调用代理对象的什么方法,都是在调用处理器的invoke方法。【被拦截】
    • 使用JDK动态代理必须要有接口【参数二需要接口】

    要实现动态代理必须要有接口的,动态代理是基于接口来代理的(实现接口的所有方法),如果没有接口的话我们可以考虑cglib代理。
    cglib代理也叫子类代理,从内存中构建出一个子类来扩展目标对象的功能

    代理模式是我们写代码中用得很多的一种模式了,Spring的AOP底层其实就是动态代理来实现的—>面向切面编程

    其实只要记住一点:原有的对象需要额外的功能,想想动态代理这项技术