zoukankan      html  css  js  c++  java
  • 动态代理个人理解

    动态代理和静态代理角色一样 需要有 真实角色、代理角色、抽象角色

    动态代理的代理类是动态生成的不是我我们直接生成的

    动态代理分为两大类:基于接口的动态代理 、基于类的动态代理

      1基于接口---JDK动态代理【这里使用】

      2基于类--cglib

      3Java 字节码实现

    需要了解两个类, Proxy(代理) ,invocationHandler (调用处理程序)

    一、抽象角色

    package xl.demo;
    
    /**
     * @author xulei
     * @version 1.0
     * @date 2020/11/15 14:49
     */
    public interface Test {
        String bark();
        
        String eat();
    }

    二、真实角色

    package xl.demo;
    
    /**
     * @author xulei
     * @version 1.0
     * @date 2020/11/15 14:56
     */
    public class TestImpl implements Test {
        
        @Override
        public String bark() {
            System.out.println("bark");
            return null;
        }
        
        @Override
        public String eat() {
            System.out.println("eat");
            return null;
        }
    }

    三、代理角色

    package xl.demo;

    import java.lang.reflect.InvocationHandler;
    import java.lang.reflect.Method;
    import java.lang.reflect.Proxy;

    /**
    * @author xulei
    * @version 1.0
    * @date 2020/11/15 14:50
    */
    public class TestProxy implements InvocationHandler {
    Object target;

    public TestProxy(Object target) {
    this.target = target;
    }

    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
    System.out.println("调用之前");
    Object invoke = method.invoke(target, args);
    System.out.println("调用之后");
    return invoke;
    }
    //获取实例对象
    public Object getProxyInstance() {
    Object o = Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(), this);
    return o;
    }
    }

    四、调用接口

    package xl.demo;
    
    import java.lang.reflect.Proxy;
    
    /**
     * @author xulei
     * @version 1.0
     * @date 2020/11/15 14:55
     */
    public class Client {
        public static void main(String[] args) {
            //真实角色
            TestImpl test = new TestImpl();
            //代理角色
            TestProxy testProxy = new TestProxy(test);
         //抽象角色,本条语句可以封装到代理角色中 Test o
    = (Test) Proxy.newProxyInstance(test.getClass().getClassLoader(), test.getClass().getInterfaces(), testProxy);
        //Test 0 = (Test)testProxy.getProxyInstance(); o.bark(); o.eat(); } }
  • 相关阅读:
    利用循环实现评论数据结构
    models中字段用处总结
    models中字段结合admin可以做验证用
    学生成绩信息管理系统
    递归完成多级评论
    python负数求余与整除原则
    python列表推导式
    Python中sorted()和sort()区别
    购物车代码(学习版,很多地方需要优化)
    for.....else用法
  • 原文地址:https://www.cnblogs.com/lovetl/p/13976910.html
Copyright © 2011-2022 走看看