zoukankan      html  css  js  c++  java
  • 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吧

  • 相关阅读:
    正则表达式实例
    正则表达式理解
    Git初体验
    浏览器加载解析HTML、JS、CSS的过程
    iframe
    纯前端,html页面间传值方式:
    Visual Code 之使用
    seajs使用记
    VBA中Dictionary对象使用(Key,Value)
    存储过程和存储函数和触发器示例
  • 原文地址:https://www.cnblogs.com/minblog/p/12556062.html
Copyright © 2011-2022 走看看