下面是一个简单的动态代理。
管理员一般有更新的功能
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吧