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

    Spring JDK 动态代理需要实现 InvocationHandler 接口,重写 invoke 方法,客户端使用 Java.lang.reflect.Proxy 类产生动态代理类的对象。

    示例

    下面使用 Eclipse IDE 演示 JDK 动态代理,步骤如下:

    • 创建 SpringDemo 项目,并在 src 目录下创建 net.biancheng 包。
    • 在 net.biancheng 包下创建 UserManager(用户管理接口)、UserManagerImpl(用户管理接口实现类)、MyAspect(切面类)和 JdkProxy(动态代理类)。
    • 运行 SpringDemo 项目。


    UserManager 类代码如下。

    package net.biancheng;
    
    public interface UserManager {
       
        // 新增用户抽象方法
        void addUser(String userName, String password);
    
        // 删除用户抽象方法
        void delUser(String userName);
    
    }

    UserManagerImpl 类代码如下。

    package net.biancheng;
    
    public class UserManagerImpl implements UserManager {
    
        @Override
        public void addUser(String userName, String password) {
            System.out.println("正在执行添加用户方法");
            System.out.println("用户名称: " + userName + " 密码: " + password);
    
        }
    
        @Override
        public void delUser(String userName) {
            System.out.println("正在执行删除用户方法");
            System.out.println("用户名称: " + userName);
        }
    
    }

    MyAspect 类代码如下。

    package net.biancheng;
    
    public class MyAspect {
        public void myBefore() {
            System.out.println("方法执行之前");
        }
    
        public void myAfter() {
            System.out.println("方法执行之后");
        }
    }

    MyAspect 类在切面中定义了两个增强的方法,分别为 myBefore 和 myAfter。

    JdkProxy 类代码如下。

    package net.biancheng;
    
    import java.lang.reflect.InvocationHandler;
    import java.lang.reflect.Method;
    import java.lang.reflect.Proxy;
    
    /**
    * JDK动态代理实现InvocationHandler接口
    *
    * @author 编程帮
    *
    */
    public class JdkProxy implements InvocationHandler {
        private Object target; // 需要代理的目标对象
        final MyAspect myAspect = new MyAspect();
    
        @Override
        public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
            myAspect.myBefore();
            Object result = method.invoke(target, args);
            myAspect.myAfter();
            return result;
        }
    
        // 定义获取代理对象方法
        private Object getJDKProxy(Object targetObject) {
           
            // 为目标对象target赋值
            this.target = targetObject;
           
            // JDK动态代理只能代理实现了接口的类,从 newProxyInstance 函数所需的参数就可以看出来
            return Proxy.newProxyInstance(targetObject.getClass().getClassLoader(), targetObject.getClass().getInterfaces(),
                    this);
        }
    
        public static void main(String[] args) {
            JdkProxy jdkProxy = new JdkProxy();    // 实例化JDKProxy对象
            UserManager user = (UserManager) jdkProxy.getJDKProxy(new UserManagerImpl());    // 获取代理对象
            user.addUser("bianchengbang", "www.biancheng.net");    // 执行新增方法
            user.delUser("bianchengbang");    // 执行删除方法
        }
    }

    运行结果如下。

    方法执行之前
    正在执行添加用户方法
    用户名称: bianchengbang 密码: www.biancheng.net
    方法执行之后


    方法执行之前
    正在执行删除用户方法
    用户名称: bianchengbang
    方法执行之后

     

    来源:

    http://c.biancheng.net/spring/jdk-proxy.html

  • 相关阅读:
    2017-2018-1 20155208 20155212 20155239 实验一 开发环境的熟悉
    2017-2018-1 20155332实验三 实时系统报告
    2017-2018-1 20155332 《信息安全系统设计基础》第九周学习总结
    第9周 实现PWD命令
    2016-2017第一学期 20155332 第八周课堂实践
    2017-2018-1 20155312 《信息安全系统设计基础》第八周学习总结
    20155332实验二 固件编程
    2017-2018-1 20155332 《信息安全系统设计基础》第7周学习总结
    20155332口令破解实验
    2017-2018-1 20155332 《信息安全系统设计基础》第六周学习总结
  • 原文地址:https://www.cnblogs.com/emanlee/p/15146904.html
Copyright © 2011-2022 走看看