1. 在不改变代码的前提下 对某一逻辑、某一方法进行增强
    2. 动态代理示例 ```java /**

      • @author:LYY
      • @Date:2022/5/13
      • 动态代理案例 */ public class ProxyTest {

        public static void main(String[] args) { Man man = new Man(); User factory = (User)ProxyObject.getFactory(man); factory.eat(“菠萝汁”); String interest = factory.interest(“打篮球”); System.out.println(interest); factory.show(); } }

    /**

    • 被代理类 */ class Man implements User {

      /**

      • 信息 */ @Override public void show() { System.out.println(“我是一个男人”); }

        /**

      • 喜欢吃的食物 *
      • @param tt */ @Override public void eat(String tt) { System.out.println(“我喜欢吃” + tt); }

        /**

      • 返回兴趣 *
      • @param inter
      • @return */ @Override public String interest(String inter) { return “兴趣:” + inter; } }

    /**

    • 动态代理 / class ProxyObject { /*

      • 无法确定被代理对象的类型 只能返回Object
      • 获得被代理对象 */ public static Object getFactory(Object o){ // 当在代理实例上调用方法时,方法调用指向被代理实例的方法 MyInvocationHandler myInvocationHandler = new MyInvocationHandler(); // 绑定被代理对象 myInvocationHandler.bind(o);

        // jdk提供的动态代理创建方法并返回 return Proxy.newProxyInstance(o.getClass().getClassLoader(), o.getClass().getInterfaces(), myInvocationHandler); }

    }

    // 动态代理需要实现的接口

    class MyInvocationHandler implements InvocationHandler{ /**

    1. * 被代理对象
    2. */
    3. private Object obj;
    4. @Override
    5. public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
    6. // 被代理方法执行前可以进行方法增强
    7. // 被代理对象方法执行
    8. Object invoke = method.invoke(obj, args);
    9. // 被代理方法执行后可以进行方法增强
    10. return invoke;
    11. }
    12. /**
    13. * 绑定被代理对象
    14. * @param o
    15. */
    16. void bind(Object o) {
    17. this.obj = o;
    18. }

    }

    /**

    • @author LYY */ interface User {
    1. /**
    2. * 信息
    3. */
    4. void show();
    5. /**
    6. * 喜欢吃的食物
    7. * @param tt
    8. */
    9. void eat(String tt);
    10. /**
    11. * 返回兴趣
    12. * @param inter
    13. * @return
    14. */
    15. String interest(String inter);

    }

    ```