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

    今天看了一下关于动态代理的东西,于是记录一下关于动态代理的东西。

    Java的动态代理:

      代理模式是Java常用的一种设计模式,下面我通过举例来描述一下动态代理。

      动态代理的相关类和方法:InvocationHandler类:public Object invoke(Object proxy, Method method, Object[] args)

      Proxy.public static Object newProxyInstance(ClassLoader loader,Class<?>[] interfaces,InvocationHandler h)

      假设接口A用方法run(),接口A的实现类B也有run()方法。而动态代理是给类B找了一个兄弟,他会冒充B类(伪B),并且实现A接口,来替B完成任务。

      动态代理的原理是在InvocationHandler让用户自己添加要实现的逻辑:在invoke()方法中自己定义要增加的逻辑(相当于spring中的增强),在Proxy的newProxyInstance()中

    传入InvocationHandler的实现,在这里Proxy重新编译代码,将增加的逻辑编译到代码中,下面一个通过动态原理生成的代理对象的java代码:

    import java.lang.reflect.Method;
    public class $Proxy1 implements UserMgr{
        public $Proxy1(InvocationHandler h) {
            this.h = h;
        }
        InvocationHandler h;
    @Override
    public void addUser() {
        try {
        Method md = UserMgr.class.getMethod("addUser");
        h.invoke(this, md);
        }catch(Exception e) {e.printStackTrace();}
    }}

      用jdk自带的Proxy类进行动态代理,需要被代理的类实现一个接口。

    public interface Moveable {
        void run();
    }
    public class Car implements Moveable{
    
        @Override
        public void run() {
            System.out.println("车在跑。。。。");
        }
    }
    package cn.edu.proxy;
    import java.lang.reflect.InvocationHandler;
    import java.lang.reflect.Method;
    import java.lang.reflect.Proxy;
    
    public class RunProxy implements InvocationHandler {
    
        private Object target;
    
        @Override
        public Object invoke(Object proxy, Method method, Object[] args)
                throws Throwable {
            Object result = null;
            System.out.println("Begining.....");
            result = method.invoke(target,args);
            System.out.println("Stopping....");
            return result;
        }
    
        public Object bind(Object target) {
            this.target=target;
            return Proxy.newProxyInstance(target.getClass().getClassLoader(),
                    target.getClass().getInterfaces(), this);
        }
    }

    测试类

    public class Test {
        public static void main(String[] args) {
            Car car = new Car();
            RunProxy runProxy = new RunProxy();
            Moveable proxy=(Moveable) runProxy.bind(car);
            proxy.run();
        }
    }

    运算结果:

    Begining.....
    车在跑。。。。
    Stopping....
  • 相关阅读:
    bzoj 1030 [JSOI2007]文本生成器
    Swift 学习笔记 (闭包)
    Swift 学习笔记 (函数)
    HTML 学习笔记 JQueryUI(Interactions,Widgets)
    HTML 学习笔记 JQuery(表单,表格 操作)
    HTML 学习笔记 JQuery(animation)
    HTML 学习笔记 JQuery(盒子操作)
    HTML 学习笔记 JQuery(事件)
    HTML 学习笔记 JQuery(DOM 操作3)
    HTML 学习笔记 JQuery(DOM 操作2)
  • 原文地址:https://www.cnblogs.com/googlemeoften/p/4932837.html
Copyright © 2011-2022 走看看