PropertyEditorSupport的使用

今天看spring1.1.1的源码的时候,看到这个东西,以前从来没见过的啊,后来看了下,

首先这个类是属于java.beans包中的内容,发现以前没怎么注意这个包里面的东西,这个包中都是一定了一些关于bean的操作的类.

发现以前啊,都是使用xml什么的格式来进行bean的定义啊,配置的,

所有就有了这个进行字符串的解析变成bean,再进行调用就方便多了,下面是示例:

实体类:

package com.demo;

import java.util.Date;

public class User {


   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=" + UserEditor.sdf.format(date) + "]";
   }
}
 

包含实体类的节点类:

package com.demo;

public class Node {
   private String nodeName;
   private User user;

   public String getNodeName() {
      return nodeName;
   }
   public void setNodeName(String nodeName) {
      this.nodeName = nodeName;
   }
   public User getUser() {
      return user;
   }
   public void setUser(User user) {
      this.user = user;
   }


}
 

package com.demo;

import java.beans.PropertyEditorSupport;
import java.text.ParseException;
import java.text.SimpleDateFormat;

/**
 * 编辑器
 */
public class UserEditor extends PropertyEditorSupport {
   
   public static final SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

   /**
    * 重写从一个字符串String变成bean的方法
    */
   @Override
   public void setAsText(String text) throws IllegalArgumentException{
      String[] tokens = text.split("\\|");
      User user = new User();
      user.setName(tokens[0]);
      user.setEmail(tokens[1]);
      try{
         user.setDate(sdf.parse(tokens[2]));
      }catch(ParseException e){
         throw new IllegalArgumentException(e);
      }
      setValue(user);
   }
}

 
package com.demo;

import java.beans.BeanInfo;
import java.beans.Introspector;
import java.beans.PropertyDescriptor;
import java.beans.PropertyEditor;
import java.beans.PropertyEditorManager;
import java.lang.reflect.Method;
import java.util.Map;

/**
 * 转换类
 */
public class PropertyEditorSample {

    /**
     * 进行转换
     */
    public static Node convert(Map<String, String> parameters)throws Exception {
       //注册bean的编辑器,放到一个WeakHashMap中
        PropertyEditorManager.registerEditor(User.class, UserEditor.class);
        Node node = new Node();
      BeanInfo bi = Introspector.getBeanInfo(Node.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(node, parameters.get(pd.getName()));
         }else{
               //根据类型查找bean的编辑器,获取到了UserEditor的实例
            PropertyEditor editor = PropertyEditorManager.findEditor(propertyType);
            if(editor != null){
               editor.setAsText(parameters.get(pd.getName()));
               writeMethod.invoke(node, editor.getValue());
            }else{
               System.out.println("no editor for:"+pd.getName());
            }
         }
        }
        return node;
   }

}
 

测试用例:

import java.util.HashMap;
import java.util.Map;

/**
 * @author zk
 * @Description: 测试用例
 * @date 2018-10-08 15:22
 */
public class Test {

    public static void main(String[] args) throws Exception {
        Map<String, String> parameters = new HashMap<String, String>(){
            {
                //这里的key要和Node里面的属性名一致
                put("nodeName", "曹操");
                put("user", "zhaoJun|changhe@163.com|2018-10-08 15:06:00");
            }
        };
        Node convert = PropertyEditorSample.convert(parameters);
        System.out.println(convert.getNodeName());
        System.out.println(convert.getUser());
    }
}
 

很简单的东西,只是把一些类里面的属性多封装了几层.

2018年10月8日15:29:48

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值