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

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

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

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 国产91一区二区在线播放不卡 | 穆挂英风流艳史小说 | 成人免费网站视频ww | 7777奇米影视 | 色悠久久久久综合网小说 | 99精品国产高清自在线看超 | 9久热这里只有精品视频在线观看 | 成人国产精品视频 | 四虎现在的网址入口2022 | 国产精品亚洲精品日韩已满 | 欧美色精品天天在线观看视频 | 色久久一个亚洲综合网 | 日韩欧美国内 | 国产精品xxxav免费视频 | 白丝女仆被啪到深夜漫画 | 国产综合成人亚洲区 | 91系列在线观看免费 | 日韩成人精品在线 | 五月最新女厕所高跟嘘嘘 | 拔插拔插8x8x海外华人免费视频 | 欧美女人p| 强波多野结衣女教师 | 乌克兰肛交影视 | 荡娃艳妇有声小说 | 好男人社区www影院在线观看 | 精品福利视频一区二区三区 | 羞羞答答影院在线 | 男男按摩1069gⅴ | 短篇艳妇系列 | 亚洲香蕉伊在人在线观看9 亚洲系列国产系列 | 亚洲精品色婷婷在线影院麻豆 | 视频精品一区二区三区 | 欧美性色老妇人 | 国内精品一区视频在线播放 | 性印度freehd| 国产精品一区二区三区免费 | 黄网久久| 毛片a级放荡的护士hd | 午夜精品在线 | 免费港剧在线观看港剧 | 成人免费在线视频网 |