BeanUtils取得對象屬性值格式

BeanUtils工具類中,有很多有用的方法可以取得對象的屬性值(如getProperty),而返回值是String類型,對於一些屬性類型,默認的返回值並不是我們想要的格式,如對象有一個Date屬性,如果不做處理,默認取得的值將是Wed Oct 24 14:00:57 CST 2012這樣的格式。

BeanUtils默認在包org\apache\commons\beanutils\converters定義了一系列的Converter對對象屬性值進行轉換。

AbstractArrayConverter.java
AbstractConverter.java
ArrayConverter.java
BigDecimalConverter.java
BigIntegerConverter.java
BooleanArrayConverter.java
BooleanConverter.java
ByteArrayConverter.java
ByteConverter.java
CalendarConverter.java
CharacterArrayConverter.java
CharacterConverter.java
ClassConverter.java
ConverterFacade.java
DateConverter.java
DateTimeConverter.java
DoubleArrayConverter.java
DoubleConverter.java
FileConverter.java
FloatArrayConverter.java
FloatConverter.java
IntegerArrayConverter.java
IntegerConverter.java
LongArrayConverter.java
LongConverter.java
NumberConverter.java
package.html
ShortArrayConverter.java
ShortConverter.java
SqlDateConverter.java
SqlTimeConverter.java
SqlTimestampConverter.java
StringArrayConverter.java
StringConverter.java
URLConverter.java


可以自己定義converter,只要實現Converter接口或者繼承AbstractConverter類
如:
public class MyDateConverter implements Converter{
    @Override
    public Object convert(Class class1, Object obj) {
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
        return sdf.format((Date)obj);
    }
  }


使用時註冊到BeanUtils中
BeanUtilsBean.setInstance(new BeanUtilsBean2());
    MyDateConverter converter1 = new MyDateConverter();
    ConvertUtils.register(converter1, Date.class);
    System.out.println(BeanUtils.getProperty(test, "date"));

或者使用默認的DateConverter,指定日期格式:
BeanUtilsBean.setInstance(new BeanUtilsBean2());
    DateConverter converter = new DateConverter();
    converter.setPattern("yyyy/MM/dd");
    ConvertUtils.register(converter, Date.class);
    System.out.println(BeanUtils.getProperty(test, "date"));

(例子見附件)

這裏須注意的是BeanUtilsBean.setInstance(new BeanUtilsBean2());在舊版本中,BeanUtils在取值時並不會根據屬性的類型使用各種各樣的Converter去取值,而是使用默認的StringConverter,而StringConverter最後只是返回屬性的toString值,如下:

BeanUtilsBean源碼中:
public String getNestedProperty(Object bean, String name)
                        throws IllegalAccessException, InvocationTargetException,
                        NoSuchMethodException {

                Object value = getPropertyUtils().getNestedProperty(bean, name);
                return (getConvertUtils().convert(value));

        }

ConverterUtilsBean源碼:
public String convert(Object value) {

                if (value == null) {
                        return null;
                } else if (value.getClass().isArray()) {
                        if (Array.getLength(value) < 1) {
                                return (null);
                        }
                        value = Array.get(value, 0);
                        if (value == null) {
                                return null;
                        } else {
                                Converter converter = lookup(String.class);
                                return ((String) converter.convert(String.class, value));
                        }
                } else {
                        Converter converter = lookup(String.class);
                        return ((String) converter.convert(String.class, value));
                }

        }

由上面源碼可以看到,在舊版本中,默認是使用StringConverter轉換器,而StringConverter只是簡單的toString處理:

protected Object convertToType(Class type, Object value) throws Throwable {
                return value.toString();
        }


在BeanUtils1.8版本以後增加了BeanUtilsBean2及ConverUtilsBean2兩個類可以根據對象屬性的類型使用不同的Converter(在初始化時,把類型及Converter放到一個Map中,使用時再根據類型取得Converter,之所以增加兩個類是避免影響之前 的版本)。

ConverterUtilsBean2相關源碼:
public String convert(Object value) {
                return (String)convert(value, String.class);
        }

調用到ConverterUtilsBean源碼:

public Object convert(Object value, Class targetType) {
.....
Object converted = value;
                Converter converter = lookup(sourceType, targetType);
             .....
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章