Java反射中java.beans包学习总结
之前一直以为PropertyEditor是SpringMVC提供的,今天才知道这个是jdk提供的,汗颜啊!
这个东西能干啥用呢?可以把字符串转成一个bean对象,springmvc在把form表单映射到controller的入参对象就是利用的这个东西。
看一个例子:
NodeDO.java:一个标准的javabean对象
publicclassNodeDO{ privateStringname; privateStringemail; privateDatedate; publicStringgetName(){ returnname; } publicvoidsetName(Stringname){ this.name=name; } publicStringgetEmail(){ returnemail; } publicvoidsetEmail(Stringemail){ this.email=email; } publicDategetDate(){ returndate; } publicvoidsetDate(Datedate){ this.date=date; } @Override publicStringtoString(){ return"NodeDO[name="+name+",email="+email+",date="+DodeDOEditor.sdf.format(date)+"]"; } }
TestDO.java一样,里面引用了NodeDO:
publicclassTestDO{ privateStringnodeName; privateNodeDOnodeDO; publicStringgetNodeName(){ returnnodeName; } publicvoidsetNodeName(StringnodeName){ this.nodeName=nodeName; } publicNodeDOgetNodeDO(){ returnnodeDO; } publicvoidsetNodeDO(NodeDOnodeDO){ this.nodeDO=nodeDO; } }
我们想实现类似这样的功能:
publicstaticvoidmain(String[]args)throwsException{ Mapparameters=newHashMap (){ { put("nodeName","小胖测试"); put("nodeDO","xiaopang|xiaopang@163.com|2015-10-2012:00:00"); } }; TestDOtestDo=convert(parameters); System.out.println(testDo.getNodeName()); System.out.println(testDo.getNodeDO()); }
把parameters这个map转化成TestDO的对象,该如何来做呢?
(1)首先要定义一个用来转化Property的PropertyEditor:
publicclassDodeDOEditorextendsPropertyEditorSupport{ publicstaticfinalSimpleDateFormatsdf=newSimpleDateFormat("yyyy-MM-ddHH:mm:ss"); @Override publicvoidsetAsText(Stringtext)throwsIllegalArgumentException{ String[]tokens=text.split("\\|"); NodeDOnodeDo=newNodeDO(); nodeDo.setName(tokens[0]); nodeDo.setEmail(tokens[1]); try{ nodeDo.setDate(sdf.parse(tokens[2])); }catch(ParseExceptione){ thrownewIllegalArgumentException(e); } setValue(nodeDo); } }
(2)做转化:
publicclassPropertyEditorSample{ static{ PropertyEditorManager.registerEditor(NodeDO.class,DodeDOEditor.class); } publicstaticvoidmain(String[]args)throwsException{ Mapparameters=newHashMap (){ { put("nodeName","小胖测试"); put("nodeDO","xiaopang|xiaopang@163.com|2015-10-2012:00:00"); } }; TestDOtestDo=convert(parameters); System.out.println(testDo.getNodeName()); System.out.println(testDo.getNodeDO()); } privatestaticTestDOconvert(Map parameters)throwsException{ TestDOtestDO=newTestDO(); BeanInfobi=Introspector.getBeanInfo(TestDO.class); PropertyDescriptor[]pds=bi.getPropertyDescriptors(); for(PropertyDescriptorpd:pds){ Class>propertyType=pd.getPropertyType(); MethodwriteMethod=pd.getWriteMethod(); if(propertyType==Class.class){ //ignore }elseif(propertyType==String.class){ writeMethod.invoke(testDO,parameters.get(pd.getName())); }else{ PropertyEditoreditor=PropertyEditorManager.findEditor(propertyType); if(editor!=null){ editor.setAsText(parameters.get(pd.getName())); writeMethod.invoke(testDO,editor.getValue()); }else{ System.out.println("noeditorfor:"+pd.getName()); } } } returntestDO; } }
其实关键点就两句话
editor.setAsText(parameters.get(pd.getName()));//1 editor.getValue();//2 //因此,一般都会在setAsText中去调用setValue()来保存转化以后的值,这样通过getValue()就能获取到了
以上就是本次整理的全部内容,如果大家还有任何不明白的地方,可以在下方留言讨论,感谢大家对毛票票的支持。