1. 程式人生 > >BeanUtils中的自動型別轉換(二)

BeanUtils中的自動型別轉換(二)

javabean

package entity;

import java.util.Date;
/**
 * 一個測試用:
 * 		student,javaBean
 * @author mzy
 *		一個標準的javaBean:
 *			1) 屬性只要是private修飾的;
 *			2) 提供setter和getter方法;
 *			3) 提供無參構造。
 *		就行了;有參構造等不是必須的。
 */
public class Student {
	private int id;
	private String name;
	private double score;
	private boolean gender;
	private Date birth;
	public int getId() {
		return id;
	}
	public void setId(int id) {
		this.id = id;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public double getScore() {
		return score;
	}
	public void setScore(double score) {
		this.score = score;
	}
	public boolean isGender() {
		return gender;
	}
	public void setGender(boolean gender) {
		this.gender = gender;
	}
	public Date getBirth() {
		return birth;
	}
	public void setBirth(Date birth) {
		this.birth = birth;
	}
	
	@Override
	public String toString() {
		return "Student [id=" + id + ", name=" + name + ", score=" + score + ", gender=" + gender + ", birth=" + birth
				+ "]";
	}
}
package beanutil;

import java.lang.reflect.InvocationTargetException;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;

import org.apache.commons.beanutils.BeanUtils;
import org.apache.commons.beanutils.ConvertUtils;
import org.apache.commons.beanutils.Converter;

import entity.Student;
/**
 * BeanUtils:
 * 		內部的自動型別轉換。
 * 		字串->Date型別,註冊轉化器;
 * 		自定義時間格式,自定義轉化器;
 * 
 * @author mzy
 *
 */
public class Demo02 {
	public static void main(String[] args) {
		Student s2 = new Student();
		/**
		 * 註冊轉換器
		 */
		// 預設的轉化器;
		// ConvertUtils.register(new DateLocaleConverter(), java.util.Date.class);
		// 自定義一個字串 -> 日期轉化器
		ConvertUtils.register(new MyDateConvert(), java.util.Date.class);
		
		try {
			/*
			 *  bean中可以傳入的全是字串,它內部會自動進行型別轉換!
			 *  String -> int
			 *  String -> boolean
			 *  String -> double
			 *  等都是ok的; 這些都是內建的轉化器;
			 *  
			 *  但是內建轉換器,預設情況下不支援:字串->日期,轉換!
			 *  如果想要進行字串日期轉換的話,要手動註冊一個轉化器。
			 */
			BeanUtils.copyProperty(s2, "id", "2");
			BeanUtils.copyProperty(s2, "name", "jacky");
			BeanUtils.copyProperty(s2, "gender", "true");
			BeanUtils.copyProperty(s2, "scroe", "90.23"); 
			// BeanUtils內建的轉化器,只支援使用: YYYY-MM-dd的格式,而且後面不能有具體的時間: 16:11:30
			// BeanUtils.copyProperty(s2, "birth","2015-06-24");
			BeanUtils.copyProperty(s2, "birth","2015/06/24 16:11:30");  //String->Date(預設情況,不支援直接從String轉為Date)
		} catch (IllegalAccessException e) {
			e.printStackTrace();
		} catch (InvocationTargetException e) {
			e.printStackTrace();
		} // 不需要依賴Student物件
		System.out.println(s2);
	}
}

/**
 * 自定義日期轉換器,實現轉換器的介面
 * @author mzy
 *
 */
class MyDateConvert implements Converter{

	/**
	 * target(src): 轉換為 什麼型別
	 * value: 需要轉換的值
	 * 該方法返回的轉換後的值
	 */
	@Override
	public Object convert(Class target, Object value) {
		try {
			SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd hh:mm:ss");
			//如果需要轉換成Date型別,則進行轉換
			if(target==Date.class){
				String date = (String)value;
				//把string按照某種轉換Date
				Date curDate = sdf.parse(date);
				return curDate;
			}
		} catch (ParseException e) {
			e.printStackTrace();
		}
		return null;
	}
}