• 动态代理个人理解


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

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

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

      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(); } }
  • 相关阅读:
    [git 学习篇] git commit原理 --实践体会
    [git 学习篇]工作区和暂存区
    [git 学习篇] git文件版本回退再学习
    [git 学习篇]版本回退
    [git 学习篇] 修改文件
    [git 学习篇] 提交文件
    [git 学习篇] --创建git创库
    [测试框架学习] 测试框架的结构包含
    [python测试框架] http接口测试框架
    向SharePoint页面添加后台代码
  • 原文地址:https://www.cnblogs.com/lovetl/p/13976910.html
Copyright © 2020-2023  润新知