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吧

原文地址:https://www.cnblogs.com/minblog/p/12556062.html