• 动态代理


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

    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....
  • 相关阅读:
    JavaWeb-对象增强的方式
    JavaWeb-dbcp连接池
    eclipse发送音频等大数据包到数据库的异常解决方案
    JDBC-prepareStatement预编译
    JDBC原理
    JDBC入门
    当我们说前端,我们在说什么?
    markdown上下左右,跳至行尾行首,重设快捷键
    web API简介(四):客户端储存之IndexedDB API
    过年搭出租车攻略
  • 原文地址:https://www.cnblogs.com/googlemeoften/p/4932837.html
Copyright © 2020-2023  润新知