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

    JDK动态代理是通过JDK中的 java.lang.reflect.Proxy 类来实现的。

    举例:

    1.有如下接口和实现类

    接口:

    public interface UserDao {
    
        public void save();
        public void update();
        public void delete();
        public void find();
    
    
    }
    

     实现类:

    public class UserDaoImpl implements UserDao {
        public void save() {
            System.out.println("save 添加用户");
        }
    
        public void update() {
            System.out.println("update 修改用户");
        }
    
        public void delete() {
            System.out.println("delete 删除用户");
        }
    
        public void find() {
            System.out.println("find 查询用户");
        }
    }
    

     2.创建切面类MyAspect

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

     3.创建MyBeanFactory类,在该类中通过Proxy实现动态代理

    public class MyBeanFactory {
    
        public static UserDao getBean(){
            // 1.准备目标类
            final UserDao userDao = new UserDaoImpl(); // 在spring中通过注入获取单例对象
            //2.创建切面类
            final MyAspect myAspect = new MyAspect();
            //3.使用代理类,进行增强
            return (UserDao)Proxy.newProxyInstance(MyBeanFactory.class.getClassLoader(),new Class[]{UserDao.class},new InvocationHandler(){
                public Object invoke(Object proxy, Method method, Object[] args) throws InvocationTargetException, IllegalAccessException {
                    //增强前
                    myAspect.myBefore();
                    Object obj = method.invoke(userDao,args);
                    //增强后
                    myAspect.myAfter();
                    return obj;
                }
            });
    
        }
    

     这里模拟了Spring框架Ioc思想
    代理类主要是对创建的实例中的方法进行增强

    4.测试

    @Test
        public void demo3(){
            
            UserDao userDao = MyBeanFactory.getBean();
            userDao.save();
            userDao.delete();
            userDao.find();
            userDao.update();
    
        }
    

    测试结果:

    5.总结:JDK动态代理模式可以减少系统间的重复代码,达到模块间的松耦合目的,让方法只关注于业务本身。

  • 相关阅读:
    喵哈哈村的魔法考试 Round #1 (Div.2) 题解
    Codeforces Round #398 (Div. 2) A. Snacktower 模拟
    Codeforces Round #397 by Kaspersky Lab and Barcelona Bootcamp (Div. 1 + Div. 2 combined) F. Souvenirs 线段树套set
    视频人脸检测——Dlib版(六)
    pip/pip3更换国内源
    OpenCV添加中文(五)
    图片人脸检测——Dlib版(四)
    视频人脸检测——OpenCV版(三)
    Tesseract Ocr文字识别
    图片人脸检测——OpenCV版(二)
  • 原文地址:https://www.cnblogs.com/outxiao/p/10991866.html
Copyright © 2011-2022 走看看