• Java 动态代理


    下面是一个简单的动态代理。

    管理员一般有更新的功能

    public interface AdminService {
            void update();
    }

    下面是管理员的实现类,假设只能修改

    public class AdminServiceImpl implements AdminService{
        public void update() {
            System.out.println("修改管理系统数据");
        }
    
    }

    现在我们可能需要添加一个超级管理员,他不仅能够修改,还能添加。普通的方法是在创建一个类实现AdminService,但是超级管理员只有一个,并不是范例。如果基类换成其它类,可能出现很多奇奇怪怪的例子,因此是无法通过添加实现类来解决的。

    现在先给出动态代理的实现方法

    public class DynamicProxyTest {
        public static void main(String[] args) {
    
            // 方法一
            System.out.println("============ 方法一 ==============");
            AdminService adminService = new AdminServiceImpl();
     
            AdminService proxyAdmin = (AdminService) Proxy.newProxyInstance(
                    adminService.getClass().getClassLoader(), 
                    adminService.getClass().getInterfaces(), 
                    (proxy,method,argss)->{
                        if(method.getName().equals("update")) {
                            System.out.println("添加管理系统数据");
                            return method.invoke(adminService, argss);
                        }
                        return null;
                    });
            proxyAdmin.update();
    
    
    
        }
    }

    控制台输出如下,可以看到成功输出了我们想要的。

       

     分析:首先看看第一个不认识的函数:Proxy.newProxyInstance

     public static Object newProxyInstance(ClassLoader loader,
                                              Class<?>[] interfaces,
                                              InvocationHandler h)
            throws IllegalArgumentException
        {
    }

        这个方法的具体描述如下:

     这个方法具体描述还没看懂,看懂了再来更新blog吧

  • 相关阅读:
    62. 不同路径-dp-中等
    49. 字母异位词分组-字符串-中等
    34. 在排序数组中查找元素的第一个和最后一个位置-二分查找-中等
    33. 搜索旋转排序数组-二分查找-中等
    221. 最大正方形-dp-中等难度
    38. 外观数列-字符串-中等难度
    mysql-索引/视图/存储过程/函数/触发器
    mysql-常用命令
    MDK5.34发布,AC6升级至V6.16(2021-03-19)
    STM32H7的CAN FD教程笔记
  • 原文地址:https://www.cnblogs.com/minblog/p/12556062.html
Copyright © 2020-2023  润新知