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(); } }
  • 相关阅读:
    Representation Data in OpenCascade BRep
    Render OpenCascade Geometry Surfaces in OpenSceneGraph
    Render OpenCascade Geometry Curves in OpenSceneGraph
    OpenCascade Shape Representation in OpenSceneGraph
    Geometry Surface of OpenCascade BRep
    Geometry Curve of OpenCascade BRep
    Tyvj2017清北冬令营入学测试
    Spfa算法模板
    洛谷1016 旅行家的预算
    洛谷1290 欧几里得的游戏
  • 原文地址:https://www.cnblogs.com/lovetl/p/13976910.html
Copyright © 2011-2022 走看看