动态代理的优点
动态代理类:在程序运行时,通过反射机制动态生成。
动态代理类通常代理接口下的所有类。
动态代理事先不知道要代理的是什么,只有在运行的时候才能确定。
动态代理的调用处理程序必须事先InvocationHandler接口,及使用Proxy类中的newProxyInstance方法动态的创建代理类。
动态代理的优点:
可以在不改变方法源码的情况下,实现对方法功能的增强,提高代码复用性。
简化了编程工作,提高开发效率,同时提高软件系统的可扩展性
可以为被代理对象的所有方法做代理
非常灵活 支持任意接口类型的实现类对象做代理,也可以直接接本身做代理
package d9_proxy; /** * FileName: Test2 * Author: lps * Date: 2022/4/26 14:04 * Sign:刘品水 Q:1944900433 */ public class Test2 { //掌握使用动态代理解决问题 理解动态代理的优势 public static void main(String[] args) { UserService userService = new UserServiceImpl(); UserService proxy = ProxyUtil.getProxy(userService); proxy.login("admin", "123456"); proxy.selectUsers(); proxy.delectUser(); proxy.delectById(9); } }
package d9_proxy; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy; /** * FileName: ProxyUtil * Author: lps * Date: 2022/4/26 14:28 * Sign:刘品水 Q:1944900433 */ public class ProxyUtil { /** * 通过静态方法 为用户业务对象返回一个代理对象 */ public static UserService getProxy(UserService obj){ return (UserService) Proxy.newProxyInstance(obj.getClass().getClassLoader(), obj.getClass().getInterfaces(), new InvocationHandler() { @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { long startTime=System.currentTimeMillis(); Object rs = method.invoke(obj, args); long endTime=System.currentTimeMillis(); System.out.println(method.getName() +"方法耗时:"+(endTime-startTime)/1000.0+"s"); return rs; } }); } }
package d9_proxy; /** * FileName: UserService * Author: lps * Date: 2022/4/26 14:03 * Sign:刘品水 Q:1944900433 */ public interface UserService { String login(String loginName, String password); void delectUser(); String selectUsers(); void delectById(int id); }
package d9_proxy; /** * FileName: UserServiceImol * Author: lps * Date: 2022/4/26 14:06 * Sign:刘品水 Q:1944900433 */ public class UserServiceImpl implements UserService { @Override public String login(String loginName, String password) { String rs = "账号和密码有错"; if ("admin".equals(loginName) && "123456".equals(password)) { rs = "登陆成功"; } try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } return rs; } @Override public void delectUser() { try { System.out.println("您正在删除用户...."); Thread.sleep(2500); } catch (InterruptedException e) { e.printStackTrace(); } } @Override public String selectUsers() { String rs = "查询了10000个用户数据"; try { System.out.println("正在为您查询..."); Thread.sleep(3000); } catch (InterruptedException e) { e.printStackTrace(); } return rs; } @Override public void delectById(int id) { try { System.out.println("根据用户的身份证号" + id + "删除了它~~"); Thread.sleep(1200); } catch (InterruptedException e) { e.printStackTrace(); } } }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix