Java反射中java.beans包學(xué)習(xí)總結(jié)
之前一直以為PropertyEditor是SpringMVC提供的,今天才知道這個(gè)是jdk提供的,汗顏??!
這個(gè)東西能干啥用呢?可以把字符串轉(zhuǎn)成一個(gè)bean對(duì)象,spring mvc在把form表單映射到controller的入?yún)?duì)象就是利用的這個(gè)東西。
看一個(gè)例子:
NodeDO.java:一個(gè)標(biāo)準(zhǔn)的javabean對(duì)象
public class NodeDO {
private String name;
private String email;
private Date date;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public Date getDate() {
return date;
}
public void setDate(Date date) {
this.date = date;
}
@Override
public String toString() {
return "NodeDO [name=" + name + ", email=" + email + ", date=" + DodeDOEditor.sdf.format(date) + "]";
}
}
TestDO.java一樣,里面引用了NodeDO:
public class TestDO {
private String nodeName;
private NodeDO nodeDO;
public String getNodeName() {
return nodeName;
}
public void setNodeName(String nodeName) {
this.nodeName = nodeName;
}
public NodeDO getNodeDO() {
return nodeDO;
}
public void setNodeDO(NodeDO nodeDO) {
this.nodeDO = nodeDO;
}
}
我們想實(shí)現(xiàn)類似這樣的功能:
public static void main(String[] args) throws Exception{
Map<String, String> parameters = new HashMap<String, String>(){
{
put("nodeName", "小胖測試");
put("nodeDO", "xiaopang|xiaopang@163.com|2015-10-20 12:00:00");
}
};
TestDO testDo = convert(parameters);
System.out.println(testDo.getNodeName());
System.out.println(testDo.getNodeDO());
}
把parameters這個(gè)map轉(zhuǎn)化成TestDO的對(duì)象,該如何來做呢?
(1)首先要定義一個(gè)用來轉(zhuǎn)化Property的PropertyEditor:
public class DodeDOEditor extends PropertyEditorSupport{
public static final SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
@Override
public void setAsText(String text) throws IllegalArgumentException{
String[] tokens = text.split("\\|");
NodeDO nodeDo = new NodeDO();
nodeDo.setName(tokens[0]);
nodeDo.setEmail(tokens[1]);
try{
nodeDo.setDate(sdf.parse(tokens[2]));
}catch(ParseException e){
throw new IllegalArgumentException(e);
}
setValue(nodeDo);
}
}
(2)做轉(zhuǎn)化:
public class PropertyEditorSample {
static{
PropertyEditorManager.registerEditor(NodeDO.class, DodeDOEditor.class);
}
public static void main(String[] args) throws Exception{
Map<String, String> parameters = new HashMap<String, String>(){
{
put("nodeName", "小胖測試");
put("nodeDO", "xiaopang|xiaopang@163.com|2015-10-20 12:00:00");
}
};
TestDO testDo = convert(parameters);
System.out.println(testDo.getNodeName());
System.out.println(testDo.getNodeDO());
}
private static TestDO convert(Map<String, String> parameters)throws Exception {
TestDO testDO = new TestDO();
BeanInfo bi = Introspector.getBeanInfo(TestDO.class);
PropertyDescriptor[] pds = bi.getPropertyDescriptors();
for(PropertyDescriptor pd : pds){
Class<?> propertyType = pd.getPropertyType();
Method writeMethod = pd.getWriteMethod();
if(propertyType == Class.class){
//ignore
}else if(propertyType == String.class){
writeMethod.invoke(testDO, parameters.get(pd.getName()));
}else{
PropertyEditor editor = PropertyEditorManager.findEditor(propertyType);
if(editor != null){
editor.setAsText(parameters.get(pd.getName()));
writeMethod.invoke(testDO, editor.getValue());
}else{
System.out.println("no editor for:"+pd.getName());
}
}
}
return testDO;
}
}
其實(shí)關(guān)鍵點(diǎn)就兩句話
<pre name="code" class="java">editor.setAsText(parameters.get(pd.getName()));//1 editor.getValue();//2 //因此,一般都會(huì)在setAsText中去調(diào)用setValue()來保存轉(zhuǎn)化以后的值,這樣通過getValue()就能獲取到了
以上就是本次整理的全部內(nèi)容,如果大家還有任何不明白的地方,可以在下方留言討論,感謝大家對(duì)腳本之家的支持。
- 詳解Spring Boot 使用Java代碼創(chuàng)建Bean并注冊(cè)到Spring中
- 淺析Java中Apache BeanUtils和Spring BeanUtils的用法
- Java 如何從spring容器中獲取注入的bean對(duì)象
- Java反射 JavaBean對(duì)象自動(dòng)生成插入,更新,刪除,查詢sql語句操作
- java Beanutils.copyProperties( )用法詳解
- Spring中基于Java的配置@Configuration和@Bean用法詳解
- NetBeans安裝提示neatbeans cannot find java 1.8 or higher
- Java中json與javaBean幾種互轉(zhuǎn)的講解
- FastJson對(duì)于JSON格式字符串、JSON對(duì)象及JavaBean之間的相互轉(zhuǎn)換操作
- spring boot攔截器注入不了java bean的原因
相關(guān)文章
Java中的Map接口實(shí)現(xiàn)類HashMap和LinkedHashMap詳解
這篇文章主要介紹了Java中的Map接口實(shí)現(xiàn)類HashMap和LinkedHashMap詳解,我們常會(huì)看到這樣的一種集合,IP地址與主機(jī)名,等,這種一一對(duì)應(yīng)的關(guān)系,就叫做映射,Java提供了專門的集合類用來存放這種對(duì)象關(guān)系的對(duì)象,需要的朋友可以參考下2024-01-01
SpringMVC中的handlerMappings對(duì)象用法
這篇文章主要介紹了SpringMVC中的handlerMappings對(duì)象用法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-09-09
Java如何使用正則表達(dá)式從字符串中提取數(shù)字
這篇文章主要介紹了Java如何使用正則表達(dá)式從字符串中提取數(shù)字問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-12-12
淺析java中String類型中“==”與“equal”的區(qū)別
這篇文章主要介紹了淺析java中String類型中“==”與“equal”的區(qū)別,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-08-08
JSON各種轉(zhuǎn)換問題(json轉(zhuǎn)List,json轉(zhuǎn)對(duì)象等)
這篇文章主要介紹了JSON各種轉(zhuǎn)換問題(json轉(zhuǎn)List,json轉(zhuǎn)對(duì)象等),本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-03-03

