javabean,BeanUtils以及 java7的新特性 .

javabean的属性 是根据 set和get方法来 操作的,而不是根据  成员变量 来操作的。注意区别   属性 和成员变量  成员变量是私有的 看不见。


一、 javabean 是什么?


Bean的中文含义是“豆子”,顾名思义,JavaBean是指一段特殊的Java类,


就是有默然构造方法,只有get,set的方法的java类的对象.

专业点解释是:


JavaBean定义了一组规则
JavaBean就是遵循此规则的平常的Java对象 


满足这三个条件:  
   1.执行java.io.Serializable 接口 
 2.提供无参数的构造器 
  3.提供getter 和 setter方法访问它的属性.


简单地说,JavaBean是用Java语言描述的软件组件模型,其实际上是一个类。这些类遵循一个接口格式,以便于使函数命名、底层行为以及继承或实现的行为,可以把类看作标准的JavaBean组件进行构造和应用。


JavaBean一般分为可视化组件和非可视化组件两种。可视化组件可以是简单的GUI元素,如按钮或文本框,也可以是复杂的,如报表组件;非可视化组件没有GUI表现形式,用于封装业务逻辑、数据库操作等。其最大的优点在于可以实现代码的可重用性。JavaBean又同时具有以下特性。


     易于维护、使用、编写。


     可实现代码的重用性。


     可移植性强,但仅限于Java工作平台。


     便于传输,不限于本地还是网络。


     可以以其他部件的模式进行工作。


对于有过其他语言编程经验的读者,可以将其看作类似微软的ActiveX的编程组件。但是区别在于JavaBean是跨平台的,而ActiveX组件则仅局限于Windows系统。总之,JavaBean比较适合于那些需要跨平台的、并具有可视化操作和定制特性的软件组件。


JavaBean组件与EJB(Enterprise JavaBean,企业级JavaBean)组件完全不同。EJB 是J2EE的核心,是一个用来创建分布式应用、服务器端以及基于Java应用的功能强大的组件模型。JavaBean组件主要用于存储状态信息,而EJB组件可以存储业务逻辑。
2  使用JavaBean的原因
程序中往往有重复使用的段落,JavaBean就是为了能够重复使用而设计的程序段落,而且这些段落并不只服务于某一个程序,而且每个JavaBean都具有特定功能,当需要这个功能的时候就可以调用相应的JavaBean。从这个意义上来讲,JavaBean大大简化了程序的设计过程,也方便了其他程序的重复使用。


JavaBean传统应用于可视化领域,如AWT(窗口工具集)下的应用。而现在,JavaBean更多地应用于非可视化领域,同时,JavaBean在服务器端的应用也表现出强大的优势。非可视化的JavaBean可以很好地实现业务逻辑、控制逻辑和显示页面的分离,现在多用于后台处理,使得系统具有更好的健壮性和灵活性。JSP + JavaBean和JSP + JavaBean + Servlet成为当前开发Web应用的主流模式。


3  JavaBean的开发


在程序设计的过程中,JavaBean不是独立的。为了能够更好地封装事务逻辑、数据库操作而便于实现业务逻辑和前台程序的分离,操作的过程往往是先开发需要的JavaBean,再在适当的时候进行调用。但一个完整有效的JavaBean必然会包含一个属性,伴随若干个get/set(只读/只写)函数的变量来设计和运行的。JavaBean作为一个特殊的类,具有自己独有的特性。应该注意以下3个方面。


     JavaBean类必须有一个没有参数的构造函数。

 

     JavaBean类所有的属性最好定义为私有的。


     JavaBean类中定义函数setXxx() 和getXxx()来对属性进行操作。其中Xxx是首字母大写的私有变量名称。

 

 

以上 转自:http://blog.csdn.net/zdwzzu2006/article/details/5151788

 

好 ,下面 是自己的学习总结

 

 

 

  1. <span style="font-size:18px;">import java.beans.PropertyDescriptor;  
  2. import java.lang.reflect.Method;  
  3.   
  4. public class IntroSpectorTest {  
  5.   
  6.     /** 
  7.      * @param args 
  8.      * @throws Exception  
  9.      */  
  10.     public static void main(String[] args) throws Exception {  
  11.           
  12.         ReflectPoint pt1 = new ReflectPoint(35);  
  13.           
  14.         String propertyName = "x";  
  15.           
  16.         PropertyDescriptor pd = new PropertyDescriptor(propertyName, pt1.getClass());  
  17.         Method methodGetX = pd.getReadMethod();// 得到 X 属性的读方法。   
  18.         Object retVal = methodGetX.invoke(pt1);  
  19.           
  20.         System.out.println(retVal);  
  21.           
  22.           
  23.         Method methodSetX = pd.getWriteMethod();// 得到 X 属性的读方法。   
  24.         methodSetX.invoke(pt1,9);  
  25.           
  26.         System.out.println(pt1.getX());  
  27.           
  28.     }  
  29. }</span>  

  1. <span style="font-size:18px;">package com.itm.day1;  
  2.   
  3.   
  4.   
  5. import java.util.Date;  
  6.   
  7. public class ReflectPoint {  
  8.     private Date birthday = new Date();  
  9.       
  10.     private int x;  
  11.     public int y;  
  12.     public String str1 = "ball";  
  13.     public String str2 = "basketball";  
  14.     public String str3 = "itcast";  
  15.       
  16.     public ReflectPoint(int x, int y) {  
  17.         super();  
  18.         this.x = x;  
  19.         this.y = y;  
  20.     }  
  21.       
  22.       
  23.     @Override  
  24.     public int hashCode() {  
  25.         final int prime = 31;  
  26.         int result = 1;  
  27.         result = prime * result + x;  
  28.         result = prime * result + y;  
  29.         return result;  
  30.     }  
  31.   
  32.   
  33.     @Override  
  34.     public boolean equals(Object obj) {  
  35.         if (this == obj)  
  36.             return true;  
  37.         if (obj == null)  
  38.             return false;  
  39.         if (getClass() != obj.getClass())  
  40.             return false;  
  41.         final ReflectPoint other = (ReflectPoint) obj;  
  42.         if (x != other.x)  
  43.             return false;  
  44.         if (y != other.y)  
  45.             return false;  
  46.         return true;  
  47.     }  
  48.   
  49.   
  50.     @Override  
  51.     public String toString(){  
  52.         return str1 + ":" + str2 + ":" + str3;  
  53.     }  
  54.   
  55.   
  56.     public int getX() {  
  57.         return x;  
  58.     }  
  59.   
  60.   
  61.     public void setX(int x) {  
  62.         this.x = x;  
  63.     }  
  64.   
  65.   
  66.     public int getY() {  
  67.         return y;  
  68.     }  
  69.   
  70.   
  71.     public void setY(int y) {  
  72.         this.y = y;  
  73.     }  
  74.   
  75.   
  76.     public Date getBirthday() {  
  77.         return birthday;  
  78.     }  
  79.   
  80.   
  81.     public void setBirthday(Date birthday) {  
  82.         this.birthday = birthday;  
  83.     }  
  84.       
  85. }  
  86. </span>  


下面 利用重构:

 



 

结果如下:

 

  1. <span style="font-size:18px;">import java.beans.IntrospectionException;  
  2. import java.beans.PropertyDescriptor;  
  3. import java.lang.reflect.InvocationTargetException;  
  4. import java.lang.reflect.Method;  
  5.   
  6. public class IntroSpectorTest {  
  7.   
  8.     /** 
  9.      * @param args 
  10.      * @throws Exception  
  11.      */  
  12.     public static void main(String[] args) throws Exception {  
  13.           
  14.         ReflectPoint pt1 = new ReflectPoint(35);  
  15.           
  16.         String propertyName = "x";  
  17.           
  18.         Object retVal = getProperty(pt1, propertyName);  
  19.           
  20.         System.out.println(retVal);  
  21.           
  22.           
  23.         PropertyDescriptor pd2 = new PropertyDescriptor(propertyName, pt1.getClass());  
  24.         Method methodSetX = pd2.getWriteMethod();// 得到 X 属性的读方法。   
  25.         methodSetX.invoke(pt1,9);  
  26.           
  27.         System.out.println(pt1.getX());  
  28.           
  29.     }  
  30.   
  31.     private static Object getProperty(ReflectPoint pt1, String propertyName)  
  32.             throws IntrospectionException, IllegalAccessException,  
  33.             InvocationTargetException {  
  34.         PropertyDescriptor pd = new PropertyDescriptor(propertyName, pt1.getClass());  
  35.         Method methodGetX = pd.getReadMethod();// 得到 X 属性的读方法。   
  36.         Object retVal = methodGetX.invoke(pt1);  
  37.         return retVal;  
  38.     }  
  39. }</span>  


接着在对 set方法 重构,注意:这里修改了值,所以啊,要在另外设置一个变量,

 

定义为  Object  value  =  9.

 

  1. <span style="font-size:18px;">import java.beans.IntrospectionException;  
  2. import java.beans.PropertyDescriptor;  
  3. import java.lang.reflect.InvocationTargetException;  
  4. import java.lang.reflect.Method;  
  5.   
  6. public class IntroSpectorTest {  
  7.   
  8.     /** 
  9.      * @param args 
  10.      * @throws Exception  
  11.      */  
  12.     public static void main(String[] args) throws Exception {  
  13.           
  14.         ReflectPoint pt1 = new ReflectPoint(35);  
  15.           
  16.         String propertyName = "x";  
  17.           
  18.         Object retVal = getProperty(pt1, propertyName);  
  19.           
  20.         System.out.println(retVal);  
  21.           
  22.         Object value = 9;  
  23.           
  24.         setProperty(pt1, propertyName, value);  
  25.           
  26.         System.out.println(pt1.getX());  
  27.           
  28.     }  
  29.   
  30.     private static void setProperty(ReflectPoint pt1, String propertyName,  
  31.             Object value) throws IntrospectionException,  
  32.             IllegalAccessException, InvocationTargetException {  
  33.         PropertyDescriptor pd2 = new PropertyDescriptor(propertyName, pt1.getClass());  
  34.         Method methodSetX = pd2.getWriteMethod();// 得到 X 属性的读方法。   
  35.         methodSetX.invoke(pt1,value);  
  36.     }  
  37.   
  38.     private static Object getProperty(ReflectPoint pt1, String propertyName)  
  39.             throws IntrospectionException, IllegalAccessException,  
  40.             InvocationTargetException {  
  41.         PropertyDescriptor pd = new PropertyDescriptor(propertyName, pt1.getClass());  
  42.         Method methodGetX = pd.getReadMethod();// 得到 X 属性的读方法。   
  43.         Object retVal = methodGetX.invoke(pt1);  
  44.         return retVal;  
  45.     }  
  46. }</span>  


下面利用一复杂的方式:

 

 

  1. <span style="font-size:18px;">// 利用 eclipse 的 重构方法。牛逼了。   
  2.     private static Object getProperty(Object pt1, String propertyName)  
  3.             throws IntrospectionException, IllegalAccessException,  
  4.             InvocationTargetException {  
  5.         /*PropertyDescriptor pd = new PropertyDescriptor(propertyName, pt1.getClass()); 
  6.         Method methodGetX = pd.getReadMethod();// 得到 X 属性的读方法。 
  7.         Object retVal = methodGetX.invoke(pt1);*/  
  8.           
  9.           
  10.         // 复杂的方式:   
  11.         BeanInfo beanInfo = Introspector.getBeanInfo(pt1.getClass());  
  12.         PropertyDescriptor[] pds = beanInfo.getPropertyDescriptors();  
  13.         Object retVal = null;  
  14.         for(PropertyDescriptor pd : pds){  
  15.             if(pd.getName().equals(propertyName)){  
  16.                 Method methodGetX = pd.getReadMethod();// 得到 X 属性的读方法。   
  17.                 retVal = methodGetX.invoke(pt1);  
  18.                 break;  
  19.             }  
  20.         }  
  21.         return retVal;  
  22.     }</span>  

 

BeanUtils,以及java7的新特性。

 

 

  1. <span style="font-size:18px;">package com.itm.day1;  
  2.   
  3. import java.beans.BeanInfo;  
  4. import java.beans.IntrospectionException;  
  5. import java.beans.Introspector;  
  6. import java.beans.PropertyDescriptor;  
  7. import java.lang.reflect.InvocationTargetException;  
  8. import java.lang.reflect.Method;  
  9.   
  10. import org.apache.commons.beanutils.BeanUtils;  
  11. import org.apache.commons.beanutils.PropertyUtils;  
  12.   
  13. public class CopyOfIntroSpectorTest2 {  
  14.   
  15.     /** 
  16.      * @param args 
  17.      * @throws Exception  
  18.      */  
  19.     public static void main(String[] args) throws Exception {  
  20.           
  21.         ReflectPoint pt1 = new ReflectPoint(35);  
  22.           
  23.         BeanUtils.setProperty(pt1, "x""10");  
  24.         System.out.println(pt1.getX());  
  25.         System.out.println(PropertyUtils.getProperty(pt1, "x").getClass().getName());  
  26.         System.out.println("-------------------------------------");  
  27.           
  28.         /* 
  29.         //java7的新特性 
  30.         Map map = {name:"zxx",age:18}; 
  31.         BeanUtils.setProperty(map, "name", "lhm"); 
  32.         */  
  33.           
  34.         //  birthday.time   
  35.         BeanUtils.setProperty(pt1, "birthday.time""111");  
  36.         System.out.println(BeanUtils.getProperty(pt1, "birthday.time"));  
  37.       
  38.     }  
  39.   
  40.       
  41.   
  42. }  
  43. </span>  



 

下面是:变量本身的类型,而 BeanUtils 是可以类型转化的,这个不会。

PropertyUtils.setProperty(pt1, "x", 9);
System.out.println("PropertyUtils :" + PropertyUtils.getProperty(pt1, "x").getClass().getName());

 

运行结果:

PropertyUtils :java.lang.Integer

 

posted @ 2012-05-08 11:33  java我最行  阅读(206)  评论(0编辑  收藏  举报