最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

基于JavaBean編輯器讀取peroperties文件的實例

 更新時間:2017年10月25日 09:39:21   作者:大明二代  
下面小編就為大家?guī)硪黄贘avaBean編輯器讀取peroperties文件的實例。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧

引言

最近在重讀《精通Spring+4.x++企業(yè)應(yīng)用開發(fā)實戰(zhàn)》這本書,看到了有關(guān)JavaBean編輯器的部分,了解到PropertyEditor和BeanInfo的使用。不得不說,BeanInfo是一個很強(qiáng)大的東西,Java中的內(nèi)省也與之有一點點小關(guān)聯(lián)。

JavaBean、PropertyEditor與BeanInfo

JavaBean簡單介紹

JavaBean是一種Java寫成的可重用組件,本質(zhì)上還是一個Java類,但是與一般的Java類不同,JavaBean必須有一個無參的構(gòu)造函數(shù),其字段必須私有化,并提供set、get方法供外界使用。根據(jù)書中所介紹,Sun所制定的JavaBean規(guī)范很大程度山是為了IDE準(zhǔn)備的--它讓IDE能夠以可視化的方式設(shè)置JavaBean的屬性。

PropertyEditor接口

PropertyEditor是屬性編輯器的接口,其作用是將一個String類型的值轉(zhuǎn)換為JavaBean的屬性。Java為PropertyEditor提供了一個默認(rèn)的實現(xiàn)類PropertyEditorSupport。

BeanInfo接口

BeanInfo用于描述JavaBean哪些屬性可以編輯及對應(yīng)屬性編輯器。Java為BeanInfo也提供了一個默認(rèn)實現(xiàn)--SimpleBeanInfo。

其他

更多有關(guān)JavaBean以及這兩個接口的知識,可以購買這本書《精通Spring+4.x++企業(yè)應(yīng)用開發(fā)實戰(zhàn)》,或者看我的Copy

一個小例子

在《精通Spring+4.x++企業(yè)應(yīng)用開發(fā)實戰(zhàn)》中使用的例子是根據(jù)《Core Java II》的一個例子改變而成,但是有一個小缺點,該例子使用到了Swing,演示時需要將代碼打成JAR包,使用IDE組件擴(kuò)展管理功能注冊到IDE中,不太方便,因此我特意嘗試用JavaBean編輯器讀取properties文件作為一個小例子。

定義一個JavaBean

我們先定義一個Person類,用作JavaBean

/**
 * 一個簡單的JavaBean
 * @author aming
 *
 */
public class Person implements Serializable {
 
 private static final long serialVersionUID = 6366021085463785872L;

 /**
  * 姓名
  */
 private String name;
 /**
  * 年齡
  */
 private int age;
 /**
  * 性別
  */
 private Gender gender;
 /**
  * 生日
  */
 private Date birthday;
 /**
  * 是否結(jié)婚
  */
 private boolean married;
 
 public String getName() {
  return name;
 }
 public void setName(String name) {
  this.name = name;
 }
 public int getAge() {
  return age;
 }
 public void setAge(int age) {
  this.age = age;
 }
 public Gender getGender() {
  return gender;
 }
 public void setGender(Gender gender) {
  this.gender = gender;
 }
 public Date getBirthday() {
  return birthday;
 }
 public void setBirthday(Date birthday) {
  this.birthday = birthday;
 }
 public boolean isMarried() {
  return married;
 }
 public void setMarried(boolean married) {
  this.married = married;
 }
 
 public Person() {
  super();
 }
 
 @Override
 public String toString() {
  return "Person [name=" + name + ", age=" + age + ", gender=" + gender + ", birthday=" + birthday + ", married="
    + married + "]";
 }
}

其中Gender是我自定義的枚舉,其代碼如下:

/**
 * 表示性別的枚舉類
 * @author aming
 *
 */
public enum Gender {
 M(1,"男"),F(2,"女");
 private int id;
 private String genderName;
 
 public String getGenderName() {
  return genderName;
 }
 
 Gender(int id,String genderName){
  this.id = id;
  this.genderName = genderName;
 }
 
 public static Gender getGender(int id) {
  for(Gender gender:values()) {
   if(gender.id == id) {
    return gender;
   }
  }
  return M;
 }
 
 public static Gender getGender(String genderName) {
  for(Gender gender:values()) {
   if(gender.genderName == genderName) {
    return gender;
   }
  }
  return M;
 }
}

實現(xiàn)PropertyEditor

Person類中有5個字段,分別使用String、int、Gender、Date和boolean這5中類型,其中對String類型變量name我們使用PropertyEditorSupport這個默認(rèn)實現(xiàn)就可以了,其他的類型我們需要自定義去實現(xiàn)PropertyEditor接口--int對應(yīng)IntegerPropertyEditor、Gender對應(yīng)GenderPropertyEditor、Date對應(yīng)DatePropertyEditor以及boolean對應(yīng)BooleanPropertyEditor。

IntegerPropertyEditor

IntegerPropertyEditor類繼承了PropertyEditorSupport類和實現(xiàn)PropertyEditor接口(個人習(xí)慣實現(xiàn)接口的時候同時繼承一個默認(rèn)實現(xiàn),這樣我可以只關(guān)心我所需要實現(xiàn)的方法,當(dāng)然,這個默認(rèn)實現(xiàn)最好是一個抽象類),重寫了getAsText()方法和setAsText(String text),其代碼如下:

@Override
public String getAsText() {
 return String.valueOf((int)getValue());
}

@Override
public void setAsText(String text) throws IllegalArgumentException {
 try {
  setValue(Integer.parseInt(text));
 } catch(NumberFormatException e) {
   throw new IllegalArgumentException(e);
 }
}

GenderPropertyEditor

GenderPropertyEditor主要是將外部獲得到的字符串去轉(zhuǎn)換為Gender,其實現(xiàn)思路是,先嘗試將該字符串轉(zhuǎn)換為Integer類型,如果轉(zhuǎn)換成功則將轉(zhuǎn)換得到Integer值通過Gender枚舉的靜態(tài)方法getGender(int id)獲取Gender類型的變量;如果轉(zhuǎn)換失敗,則將該字符串看作genderName,再去獲取Gender。至于Gender到字符串,直接返回genderName就可以了。主要代碼如下:

@Override
public String getAsText() {
 Gender value = (Gender)getValue();
 return value.getGenderName();
}

@Override
public void setAsText(String value) throws IllegalArgumentException {
 try {
  setValue(Gender.getGender(Integer.valueOf(value)));
 }catch(NumberFormatException ex) {
  setValue(Gender.getGender(value));
 }  
}

DatePropertyEditor

DatePropertyEditor的思路和GenderPropertyEditor相似,其核心代碼獻(xiàn)上:

private DateFormat df;
 
@Override
public String getAsText() {
 Date date = (Date)getValue();
 return df.format(date);
}

@Override
public void setAsText(String text) throws IllegalArgumentException {
 try {
  setValue(df.parse(text));
 } catch (ParseException e) {
  throw new IllegalArgumentException(e);  
 }
}
 
public DatePropertyEditor() {
 super();
 this.df = new SimpleDateFormat("yyyy-MM-dd");
}

BooleanPropertyEditor

BooleanPropertyEditor與IntegerPropertyEditor一樣,實現(xiàn)非常類似:

@Override
public String getAsText() {
 return String.valueOf((boolean)getValue());
}

@Override
public void setAsText(String text) throws IllegalArgumentException {
 setValue(Boolean.valueOf(text));
}

自定義BeanInfo

定義PersonBeanInfo類,用于描述Person屬性和相對應(yīng)的PropertyEditor。代碼如下:

public class PersonBeanInfo extends SimpleBeanInfo implements BeanInfo {

 @Override
 public PropertyDescriptor[] getPropertyDescriptors() {
  List<PropertyDescriptor> list = new ArrayList<>();
  try {
   // 將Person中name與PropertyEditorSupport綁定
   PropertyDescriptor namePropertyDescriptor = new PropertyDescriptor("name",Person.class);
   namePropertyDescriptor.setPropertyEditorClass(PropertyEditorSupport.class);
   // 將Person中age與IntegerPropertyEditor綁定
   PropertyDescriptor agePropertyDescriptor = new PropertyDescriptor("age",Person.class);
   agePropertyDescriptor.setPropertyEditorClass(IntegerPropertyEditor.class);
   // 將Person中g(shù)ender與GenderPropertyEditor綁定
   PropertyDescriptor genderPropertyDescriptor = new PropertyDescriptor("gender", Person.class);
   genderPropertyDescriptor.setPropertyEditorClass(GenderPropertyEditor.class);
   // 將Person中birthday與DatePropertyEditor綁定
   PropertyDescriptor birthdayPropertyDescriptor = new PropertyDescriptor("birthday",Person.class);
   birthdayPropertyDescriptor.setPropertyEditorClass(DatePropertyEditor.class);
   // 將Person中married與BooleanPropertyEditor綁定
   PropertyDescriptor marriedPropertyDescriptor = new PropertyDescriptor("married",Person.class);
   marriedPropertyDescriptor.setPropertyEditorClass(BooleanPropertyEditor.class);
   
   list.add(namePropertyDescriptor);
   list.add(agePropertyDescriptor);
   list.add(genderPropertyDescriptor);
   list.add(birthdayPropertyDescriptor);
   list.add(marriedPropertyDescriptor);
   
   return list.toArray(new PropertyDescriptor[list.size()]);
  } catch (IntrospectionException ex) {
   ex.printStackTrace();
  }
  return null;
 }
}

創(chuàng)建配置文件

因為我創(chuàng)建的是一個普通的Java項目,因此我選擇在src目錄下創(chuàng)建person.properites文件,文件內(nèi)容如下:

name=arthurming
age=18
gender=1
birthday=2017-10-24
married=true

測試

測試代碼

@Test
 public void test() throws IOException, IllegalAccessException, IllegalArgumentException, InvocationTargetException, InstantiationException {
  Properties p = new Properties();
  InputStream is =this.getClass().getClassLoader().getResourceAsStream("person.properties");
  p.load(is);
  BeanInfo beanInfo = new PersonBeanInfo();
  PropertyDescriptor[] propertyDescriptoies = beanInfo.getPropertyDescriptors();
  Person person = new Person();
  for(PropertyDescriptor propertyDescriptor : propertyDescriptoies) {
   String key = propertyDescriptor.getName();
   String value = p.getProperty(key);
   Method method = propertyDescriptor.getWriteMethod();
   PropertyEditor pe = (PropertyEditor) propertyDescriptor.getPropertyEditorClass().newInstance();
   if(pe.getClass() == PropertyEditorSupport.class) { //①
    pe.setValue(value);
   } else {
    pe.setAsText(value);   
   }
   method.invoke(person,pe.getValue());
  }
  System.out.println(person);
 }

說明:代碼①表示當(dāng)pe類型是PropertyEditorSupport,而不是我所定義PropertyEdtior,應(yīng)該使用setValue方法而不是setAsText方法。

因為在PropertyEditorSupport中,其setAsText()方法為:

public void setAsText(String text) throws java.lang.IllegalArgumentException {
 if (value instanceof String) {
  setValue(text);
  return;
 }
 throw new java.lang.IllegalArgumentException(text);
}

如果使用setAsText()方法,那么由于value不是String類型,將會拋出IllegalArgumentException。不過很遺憾我搞明白value到底實際上什么類型......

測試結(jié)果

Person [name=arthurming, age=18, gender=M, birthday=Tue Oct 24 00:00:00 CST 2017, married=true]

小結(jié)

感覺您能容忍我拙劣的文筆看到現(xiàn)在,也希望你在讀《精通Spring+4.x++企業(yè)應(yīng)用開發(fā)實戰(zhàn)》這本書時,看到有關(guān)JavaBean編輯器的知識,我的這個例子可以對你有所幫助。

以上這篇基于JavaBean編輯器讀取peroperties文件的實例就是小編分享給大家的全部內(nèi)容了,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • Java Arrays.sort()用法詳解

    Java Arrays.sort()用法詳解

    這篇文章主要介紹了Java Arrays.sort()用法詳解,本篇文章通過簡要的案例,講解了該項技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-08-08
  • Java實戰(zhàn)之兼職平臺系統(tǒng)的實現(xiàn)

    Java實戰(zhàn)之兼職平臺系統(tǒng)的實現(xiàn)

    這篇文章主要介紹了如何利用Java編寫一個兼職平臺系統(tǒng),采用到的技術(shù)有Springboot、SpringMVC、MyBatis、ThymeLeaf等,感興趣的小伙伴可以了解一下
    2022-03-03
  • Java實現(xiàn)可視化走迷宮小游戲的示例代碼

    Java實現(xiàn)可視化走迷宮小游戲的示例代碼

    這篇文章主要介紹了Java如何實現(xiàn)可視化走迷宮小游戲。本程序適用于java程序員鞏固類與對象、文件讀取、事件響應(yīng)、awt包中各種工具的相關(guān)概念以及對邏輯能力的鍛煉,需要的可以參考一下
    2022-11-11
  • Java阻塞隊列BlockingQueue基礎(chǔ)與使用

    Java阻塞隊列BlockingQueue基礎(chǔ)與使用

    本文詳細(xì)介紹了BlockingQueue家庭中的所有成員,包括他們各自的功能以及常見使用場景,通過實例代碼介紹了Java 阻塞隊列BlockingQueue的相關(guān)知識,需要的朋友可以參考下
    2023-01-01
  • 利用Java實現(xiàn)玩家打怪小游戲的完整過程

    利用Java實現(xiàn)玩家打怪小游戲的完整過程

    這篇文章主要介紹了如何使用Java創(chuàng)建一個簡單的“打怪小游戲”,游戲中的角色分為法師、戰(zhàn)士、BOSS和一個Team類,代碼展示了如何通過面向?qū)ο缶幊虂韺崿F(xiàn)一個基本的戰(zhàn)斗系統(tǒng),需要的朋友可以參考下
    2024-12-12
  • Value注解支持對象類型ConfigurationProperties功能

    Value注解支持對象類型ConfigurationProperties功能

    這篇文章主要為大家介紹了Value注解支持對象類型ConfigurationProperties功能詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-10-10
  • Java設(shè)計模式之備忘錄模式

    Java設(shè)計模式之備忘錄模式

    這篇文章介紹了Java設(shè)計模式之備忘錄模式,文中通過示例代碼介紹的非常詳細(xì)。對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-10-10
  • Spring Cloud Gateway入門解讀

    Spring Cloud Gateway入門解讀

    本篇文章主要介紹了Spring Cloud Gateway入門解讀,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-04-04
  • 聊聊spring @Transactional 事務(wù)無法使用的可能原因

    聊聊spring @Transactional 事務(wù)無法使用的可能原因

    這篇文章主要介紹了spring @Transactional 事務(wù)無法使用的可能原因,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-07-07
  • MyBatis-Plus中如何實現(xiàn)動態(tài)表名

    MyBatis-Plus中如何實現(xiàn)動態(tài)表名

    這篇文章主要介紹了MyBatis-Plus中如何實現(xiàn)動態(tài)表名問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-07-07

最新評論

苍南县| 临安市| 两当县| 静海县| 寿阳县| 缙云县| 勃利县| 衡山县| 平利县| 黄浦区| 韶山市| 宁德市| 宣汉县| 开平市| 大田县| 濉溪县| 建德市| 贵德县| 加查县| 德令哈市| 犍为县| 大姚县| 石泉县| 庆云县| 田阳县| 永清县| 昌邑市| 华阴市| 襄樊市| 永善县| 黑河市| 南雄市| 夏邑县| 丰镇市| 林口县| 星子县| 仙游县| 温泉县| 平乐县| 滨州市| 富顺县|