java之beanutils技术
用來操作對象,給對象屬性賦值。
我們之前用到的就是構造函數,然后set與get 方法
先來看一個User對象類
package domain;import java.util.Date;/*** 用來為其賦值*/ public class User {private int id;private String username;private String password;private char gender;private Date date;//這個不是基礎類型@Overridepublic String toString() {return "User{" +"id=" + id +", username='" + username + '\'' +", password='" + password + '\'' +", gender=" + gender +", date=" + date +'}';}public Date getDate() {return date;}public void setDate(Date date) {this.date = date;}public User(int id, String username, String password, char gender, Date date) {this.id = id;this.username = username;this.password = password;this.gender = gender;this.date = date;}public User() {}public void setId(int id) {this.id = id;}public void setUsername(String username) {this.username = username;}public void setPassword(String password) {this.password = password;}public void setGender(char gender) {this.gender = gender;}public int getId() {return id;}public String getUsername() {return username;}public String getPassword() {return password;}public char getGender() {return gender;}}簡單來說一下,從時間效率上來說,set與get要比beanutils快一些,效率高一些,但是在某些數據的處理上,顯得有點愚鈍,比如如果在一個類中,設計了一個Date對象,或者其他對象,我們傳入的時候就必須傳入這個對象本身,比如new Date(),這樣的數據處理顯然在beanutils中是不太好看的。因為他可能就是這樣打印
我們其實更想的是能不能直接接收一個1995-12-23這樣的數據,同時他是一個Date對象,這里就要用到BeanUtils類來進行設計
BeanUtils類在setProperties的時候,如果我們傳入的都是字符串,那么是可以自動幫我們進行數據類型轉換的。這類僅限向基本數據類型轉換。
就像上面這樣,可以傳入一個字符串(這個會自動幫我們解析成為相應的數據類型),也可以傳入這個屬性本身相應的數據類型。
下面來說一下,一般通過表單來傳輸數據,表單傳的數據,全都是字符串,而我們通過request域來拿到數據,拿到數據之后我們要把數據封裝到對象里面,或者拿到數據之后要與數據庫中的數據進行比較,都是字符串,假如我們實際存放的數據不是字符串呢,你說怎么存放到對象,或者說與數據庫里面的數據進行比較。
這個時候如果用到的是BeanUtils這個類,那么就方便了,她能幫我們把字符串直接轉換成基本數據類型,那么又會延伸出一個問題,如果在一個對象里面存放的不是基本數據類型呢,比如是一個Date呢,那么我們就要用到準換器,換句話說,就是我們在進行數據的setProperty()之前,調用一下這個函數
如果沒設置轉換器,你直接賦值一個字符串格式的日期肯定不行
?
話不多上代碼
//給Date對象設置一個轉換器public static void test1() throws InvocationTargetException, IllegalAccessException {User user = new User();//設置轉換器//第一個參數做了一個匿名內部類,實現了一個convert轉換函數ConvertUtils.register(new Converter() {@Overridepublic Object convert(Class aClass, Object o) {//需要轉換的數據為nullif(o == null) {return null;}//另外就是如果數據不是String 類型的if(!(o instanceof String)) {throw new ConversionException("只支持String類型的數據轉換");}//上面就說明數據非空String str = (String)o;//判斷str是否為空,也就說可能有惡意用戶往里面傳入空格的情況//先去掉空格再來判斷數據是否為空if(str.trim().equals("")) {return null;}//下面再來變成相應的字符串類型SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");try {return sdf.parse(str);//把這個str變成相應日期Date對象} catch (ParseException e) {//這里如果出現了異常,一定通知給上一層程序throw new RuntimeException(e);}}},Date.class);BeanUtils.setProperty(user,"date","1995-12-23");System.out.println(user.getDate());//這里就可以把我們傳入的字符串格式的東西,變成Date對象}?在來說一下整體賦值populate()方法,這個方法可以把一個map集合中的鍵值對映射給一個對象的屬性當中,這里需要注意的一個是,鍵值對,必須與一個類中的屬性名相互匹配,不然是會賦值不成功的.
//利用map對象映射屬性值到一個對象當中public static void test2() throws InvocationTargetException, IllegalAccessException {User user = new User();//里面有個date,所以必須要有一個轉換器ConvertUtils.register(new Converter() {@Overridepublic Object convert(Class aClass, Object o) {//需要轉換的數據為nullif(o == null) {return null;}//另外就是如果數據不是String 類型的if(!(o instanceof String)) {throw new ConversionException("只支持String類型的數據轉換");}//上面就說明數據非空String str = (String)o;//判斷str是否為空,也就說可能有惡意用戶往里面傳入空格的情況//先去掉空格再來判斷數據是否為空if(str.trim().equals("")) {return null;}//下面再來變成相應的字符串類型SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");try {return sdf.parse(str);//把這個str變成相應日期Date對象} catch (ParseException e) {//這里如果出現了異常,一定通知給上一層程序throw new RuntimeException(e);}}},Date.class);Map<String,String> map = new HashMap<String,String>();map.put("id","001");map.put("username","張三");map.put("password","5201314");map.put("gender","男");map.put("date","1995-12-23");BeanUtils.populate(user,map);System.out.println(user);}運行結果?
總結
以上是生活随笔為你收集整理的java之beanutils技术的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 抢手机型ROOT测评 ROOT大师成功率
- 下一篇: java服务端限流框架,美团大众点评服务