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....
  • 相关阅读:
    使用通配符查询
    使用聚合函数查询
    有趣的图标
    利用Office Chart 制作柱图(一个柱子)
    众多select
    对象不能从 DBNull 转换为其他类型。
    使用谓词进行查询
    使用数学函数查询
    学生信息表 通过选择年级和班级得到详细的学生信息名单
    使用时间函数查询
  • 原文地址:https://www.cnblogs.com/googlemeoften/p/4932837.html
Copyright © 2011-2022 走看看