一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|JAVA教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|JavaScript|易語言|

服務器之家 - 編程語言 - JAVA教程 - Java反射中java.beans包學習總結

Java反射中java.beans包學習總結

2021-04-06 11:27若魚1919 JAVA教程

本篇文章通過學習Java反射中java.beans包,把知識點做了總結,并把相關內容做了關聯,對此有需要的朋友可以學習參考下。

之前一直以為PropertyEditor是SpringMVC提供的,今天才知道這個是jdk提供的,汗顏啊!

這個東西能干啥用呢?可以把字符串轉成一個bean對象,spring mvc在把form表單映射到controller的入參對象就是利用的這個東西。

看一個例子:

NodeDO.java:一個標準的javabean對象

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
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:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
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;
  }
}

我們想實現類似這樣的功能:

?
1
2
3
4
5
6
7
8
9
10
11
public static void main(String[] args) throws Exception{
    Map<String, String> parameters = new HashMap<String, String>(){
      {
        put("nodeName", "小胖測試");
        put("nodeDO", "xiaopang|[email protected]|2015-10-20 12:00:00");
      }
    }; 
    TestDO testDo = convert(parameters);
    System.out.println(testDo.getNodeName());
    System.out.println(testDo.getNodeDO());
  }

把parameters這個map轉化成TestDO的對象,該如何來做呢?

(1)首先要定義一個用來轉化Property的PropertyEditor:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
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)做轉化:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
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|[email protected]|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;
  }
 
}

其實關鍵點就兩句話

?
1
2
3
<pre name="code" class="java">editor.setAsText(parameters.get(pd.getName()));//1
editor.getValue();//2
//因此,一般都會在setAsText中去調用setValue()來保存轉化以后的值,這樣通過getValue()就能獲取到了

以上就是本次整理的全部內容,如果大家還有任何不明白的地方,可以在下方留言討論,感謝大家對服務器之家的支持。

原文鏈接:http://blog.csdn.net/goldenfish1919/article/details/49275973

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 日韩精品福利视频一区二区三区 | 亚洲国产精品久久卡一 | fulao在线观看的 | 嗯啊好爽视频 | 亚洲国产情侣一区二区三区 | 三级黄片毛片 | 艹b小说| 午夜福利试看120秒体验区 | 天天夜夜草草久久伊人天堂 | 色老妇 | 日本在线国产 | 免费永久视频 | 欧洲vodafone精品性 | 久久re视频精品538在线 | 97午夜视频 | 亚洲黄色免费在线观看 | 特黄aa级毛片免费视频播放 | 欧洲网色偷偷亚洲男人的天堂 | 精品视频免费在线 | 啪啪导航| 久久婷婷五月综合色丁香 | 欧美视频一区二区三区在线观看 | 亚洲天堂精品在线观看 | 日韩精品亚洲一级在线观看 | 91桃花视频 | 日本一卡2卡3卡4卡乱 | 日韩成a人片在线观看日本 日韩不卡一区二区 | 女仆色永久免费网站 | 亚洲精品国产A久久久久久 亚洲精品福利一区二区在线观看 | www亚洲色图 | 天堂网在线.www天堂在线视频 | 鬼惨笑小说 | 国产精品久久一区 | 91麻豆精品国产片在线观看 | 天天操网 | 色综合色狠狠天天综合色 | 俺去俺去啦最新官网在线 | 久久爽狠狠添AV激情五月 | 和两个男人玩3p好爽视频 | chaopeng在线观看 | 国产一精品一av一免费爽爽 |