当前位置: 首页 > 科技观察

开发工具HutoolMapProxy的精彩使用

时间:2023-03-15 16:11:12 科技观察

概述Hutool是一个小而全的Java工具库。通过静态方法封装,降低相关API的学习成本,提高工作效率,让Java像函数式语言一样优雅。Java语言也可以很“甜”。目前公司项目中主要使用Hutool作为项目工具包。与google的guava相比,hutool的工具使用了中文注释,更适合国人使用。所谓知己知彼,我们需要了解Hutool有哪些功能,才能发挥出最大的价值。本文主要介绍hutool5.8.8中MapProxy的使用。场景介绍其实Map在拿到的时候是比较危险的。你可能不知道它是什么类型的,你需要强制它。例如:@TestpublicvoidtestMapProxy1(){MapuserMap=MapUtil.newHashMap(16);userMap.put("用户名","alvin");userMap.put("年龄",20);//使用map时,需要进行强制转换。一旦类型不对就会报错Stringage=(String)userMap.get("age");}运行结果:有没有更好的解决办法?Hutool为我们提供了解决方案。MapProxy导入cn.hutoolhutool-all5.8.8定义一个可访问的接口interfaceMapUser{StringgetUsername();整数getAge();MapUsersetAge(整数年龄);}通过MapProxy访问@TestpublicvoidtestMapProxy2(){MapuserMap=MapUtil.newHashMap(16);userMap.put("用户名","alvin");userMap.put("年龄",20);MapProxymapProxy=MapProxy.create(userMap);Integerage=mapProxy.getInt("age",18);Assert.assertTrue(age==20);//通过代理MapUsermapUser=mapProxy.toProxyBean(MapUser.class);//后续访问会更加安全Assert.assertTrue(mapUser.getAge()==20);mapUser.setAge(30);断言。assertTrue(mapUser.getAge()==30);}MapProxy源码解析Map代理,提供各种getXXX方法,并提供默认值支持。其类结构图如下:实现了OptNullBasicTypeFromObjectGetter接口,提供了get的基本类型,如果没有提供默认值,如果值不存在或者获取错误,返回null,如:mapProxy.getInt("age",18).实现InvocationHandler接口,支持jdk的动态代理,生成代理对象。publicTtoProxyBean(ClassinterfaceClass){return(T)Proxy.newProxyInstance(ClassLoaderUtil.getClassLoader(),newClass[]{interfaceClass},this);}toProxyBean方法是生成代理object,最后会调用代理类的invoke方法,这里的代理类就是MapProxy本身。publicObjectinvoke(Objectproxy,Methodmethod,Object[]args){finalClass[]parameterTypes=method.getParameterTypes();//如果调用方法参数为空if(ArrayUtil.isEmpty(parameterTypes)){finalClassreturnType=method.getReturnType();//方法返回值不是voidif(void.class!=returnType){//配置GetterfinalStringmethodName=method.getName();字符串字段名=空;if(methodName.startsWith("get")){//配置getXXXfieldName=StrUtil.removePreAndLowerFirst(methodName,3);}elseif(BooleanUtil.isBoolean(returnType)&&methodName.startsWith("is")){//配置isXXXfieldName=StrUtil.removePreAndLowerFirst(methodName,2);}elseif("hashCode".equals(methodName)){returnthis.hashCode();}elseif("toString".equals(methodName)){返回这个。toString();}if(StrUtil.isNotBlank(fieldName)){if(false==this.containsKey(fieldName)){//CamelCase不存在,尝试转换为下划线fieldName=StrUtil.toUnderlineCase(fieldName);}returnConvert.convert(method.getGenericReturnType(),this.get(fieldName));}}//如果方法参数不为空}elseif(1==parameterTypes.length){//匹配SetterfinalStringmethodName=method.getName();如果(methodName.startsWith("set")){finalStringfieldName=StrUtil.removePreAndLowerFirst(methodName,3);如果(StrUtil.isNotBlank(fieldName)){this.put(fieldName,args[0]);最终类returnType=method.getReturnType();//判断返回类型是否为代理类的实例if(returnType.isInstance(proxy)){returnproxy;}}}别的if("equals".equals(methodName)){returnthis.equals(args[0]);}}thrownewUnsupportedOperationException(method.toGenericString());}总结本文主要讲解Hutool中MapProxy类的使用,希望对大家有所帮助