PropertyEditor

    在java中,最常见的是一个类型转换为另一个类型.比如表单对象映射为实体类。比如Jfinal的TypeConverter.convert().

    如果不想这样写,可以使用PropertyEditor:

    默认的PropertyEditor.getEditorSearchPath查找的结果是:sun.beans.editors包下的类。支持的不是很多,下面以BigDecimal为例子,简单的代码如下:

package test.beans.editors;

import java.beans.PropertyEditorSupport;
import java.math.BigDecimal;


public class BigDecimalEditor extends PropertyEditorSupport{
    
    private BigDecimal value;
    
    public void setValue(Object value) {
        boolean isSuccess = true;
        StringBuilder errorMsg = new StringBuilder(" Could not converters BigDecimal") ;
        try {
            this.value =  BigDecimal.valueOf(Long.valueOf(value.toString()));
            return ;
        } catch (Exception e) {
            isSuccess = false ;
            errorMsg.append(" Used Long ");
        }
        try {
            this.value  = BigDecimal.valueOf(Double.valueOf(value.toString()));
            return ;
        } catch (Exception e) {
            if(!isSuccess) errorMsg.append(",");
            errorMsg.append(" Used Double ");
            isSuccess = false ;
        }
        if(!isSuccess)    throw new RuntimeException( errorMsg.append(" from ").toString() +value.getClass().getSimpleName() +" : "+ value.toString() ) ;
    }

    /**
     * Gets the value of the property.
     *
     * @return The value of the property.
     */
    public BigDecimal getValue() {
        return value;
    }
    
}

定义转换方法如下:

public static Object converter(Class<?> clazz,Object value){
        String[] path = {"test.beans.editors"};    //设置搜索的目录
        PropertyEditorManager.setEditorSearchPath(path);    
//        System.out.println(PropertyEditorManager.getEditorSearchPath()[0]);
        PropertyEditor peEditor = PropertyEditorManager.findEditor(clazz);
        peEditor.setValue(value);
        return peEditor.getValue();
    }

调用下转换:

public static void main(String[] args) {
        Object obj = BeansUtil.converter(BigDecimal.class, "123.41");
        System.out.println(obj.getClass().getSimpleName() + ":" + obj);
        
    }

结果如下:

    BigDecimal:123.41

其中最重要的点是BigDecimalEditor类的命名,XXXEditor(XXX为要转换的目标类的名称)和设置路径。要不然PropertyEditorManager.findEditor就找不到。具体可以参考Spring的org.springframework.beans.propertyeditors包下面的类丶。

你可能感兴趣的:(PropertyEditor)