Java反射中java.beans包學(xué)習(xí)總結(jié)
之前一直以為PropertyEditor是SpringMVC提供的,今天才知道這個是jdk提供的,汗顏?。?br />
這個東西能干啥用呢?可以把字符串轉(zhuǎn)成一個bean對象,spring mvc在把form表單映射到controller的入?yún)ο缶褪抢玫倪@個東西。
看一個例子:
NodeDO.java:一個標準的javabean對象
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;
}
}
我們想實現(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這個map轉(zhuǎn)化成TestDO的對象,該如何來做呢?
(1)首先要定義一個用來轉(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;
}
}
其實關(guān)鍵點就兩句話
<pre name="code" class="java">editor.setAsText(parameters.get(pd.getName()));//1 editor.getValue();//2 //因此,一般都會在setAsText中去調(diào)用setValue()來保存轉(zhuǎn)化以后的值,這樣通過getValue()就能獲取到了
以上就是本次整理的全部內(nèi)容,如果大家還有任何不明白的地方,可以在下方留言討論,感謝大家對腳本之家的支持。
- 詳解Spring Boot 使用Java代碼創(chuàng)建Bean并注冊到Spring中
- 淺析Java中Apache BeanUtils和Spring BeanUtils的用法
- Java 如何從spring容器中獲取注入的bean對象
- Java反射 JavaBean對象自動生成插入,更新,刪除,查詢sql語句操作
- java Beanutils.copyProperties( )用法詳解
- Spring中基于Java的配置@Configuration和@Bean用法詳解
- NetBeans安裝提示neatbeans cannot find java 1.8 or higher
- Java中json與javaBean幾種互轉(zhuǎn)的講解
- FastJson對于JSON格式字符串、JSON對象及JavaBean之間的相互轉(zhuǎn)換操作
- spring boot攔截器注入不了java bean的原因
相關(guān)文章
intellij idea修改maven配置時總是恢復(fù)默認配置的解決方法idea版本(2020.2.x)
這篇文章主要介紹了intellij idea修改maven配置時總是恢復(fù)默認配置的解決方法idea版本(2020.2.x),本文給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-08-08
Java Lambda表達式的方法引用和構(gòu)造器引用實例分析
這篇文章主要介紹了Java Lambda表達式的方法引用和構(gòu)造器引用,結(jié)合實例形式分析了Lambda表達式的方法引用和構(gòu)造器引用相關(guān)原理、用法及操作注意事項,需要的朋友可以參考下2019-09-09
Java存儲過程調(diào)用CallableStatement的方法
這篇文章主要介紹了Java存儲過程調(diào)用CallableStatement的方法,幫助大家更好的理解和學(xué)習(xí)Java,感興趣的朋友可以了解下2020-11-11
JAVA基于PDF box將PDF轉(zhuǎn)為圖片的實現(xiàn)方法
這篇文章主要介紹了JAVA基于PDF box將PDF轉(zhuǎn)為圖片的操作方法,本文給大家介紹的非常詳細,具有一定的參考借鑒價值 ,需要的朋友可以參考下2019-07-07
hutool實戰(zhàn):IoUtil 流操作工具類(將內(nèi)容寫到流中)
這篇文章主要介紹了Go語言的io.ioutil標準庫使用,是Golang入門學(xué)習(xí)中的基礎(chǔ)知識,需要的朋友可以參考下,如果能給你帶來幫助,請多多關(guān)注腳本之家的其他內(nèi)容2021-06-06
Java中通過sftp協(xié)議實現(xiàn)上傳下載的示例代碼
在java開發(fā)中遇到需要將linux系統(tǒng)中指定目錄下的文件下載到windows本地的需求,本文就來介紹Java中通過sftp協(xié)議實現(xiàn)上傳下載,具有一定的參考價值,感興趣的可以了解一下2024-06-06

