概述

JavaBean代表一类特殊的Java类,这种类主要用来存储和传递属性信息,JavaBean中的方法主要用于设置和获取这些私有属性,他们有一定的命名规则,我们可以把它们想象为一个侧重属性信息的类,如JSP中的表单信息打包一样,这些信息就可以封装在一个JavaBean对象中,通过一些特殊的方式来操作。

Introspector,即为内省

public class Introspector
extends Object

Introspector 类为通过工具学习有关受目标 Java Bean 支持的属性、事件和方法的知识提供了一个标准方法。

简单说,Introspector就是一种操作JavaBean的标准方式

JavaBean一些简单操作

写一个Bean类用作测试

   1: public class Bean {

   2:     private String name;

   3:     private int age;

   4:     private int num;

   5:     private int score;

   6:     

   7:     public Bean(String name, int age, int num, int score) {

   8:         super();

   9:         this.name = name;

  10:         this.age = age;

  11:         this.num = num;

  12:         this.score = score;

  13:     }

  14:     public String getName() {

  15:         return name;

  16:     }

  17:     public void setName(String name) {

  18:         this.name = name;

  19:     }

  20:     public int getAge() {

  21:         return age;

  22:     }

  23:     public void setAge(int age) {

  24:         this.age = age;

  25:     }

  26:     public int getNum() {

  27:         return num;

  28:     }

  29:     public void setNum(int num) {

  30:         this.num = num;

  31:     }

  32:     public int getScore() {

  33:         return score;

  34:     }

  35:     public void setScore(int score) {

  36:         this.score = score;

  37:     }

  38: }

实现set和get方法的简单操作

   1: public class BeanTest {

   2:  

   3:     /**

   4:      * @param args

   5:      */

   6:     public static void main(String[] args) {

   7:         

   8:         //获取对象

   9:         Bean b = new Bean("Shawn",12,1,97);

  10:         //获取类字节码文件

  11:         Class beanClass = Bean.class;    

  12:         //设置需要操作的属性名

  13:         String propertyName = "name";

  14:         

  15:         //调用set和get方法

  16:         System.out.println(getProperty(beanClass, b, propertyName, null));

  17:         setProperty(beanClass, b, propertyName, new Object[]{"Feng"});

  18:         System.out.println(getProperty(beanClass, b, propertyName, null));

  19:                 

  20:     }

  21:     //封装javabean的set方法

  22:     private static void setProperty(Class beanClass,Object obj,String propertyName,Object[] values){

  23:         try {

  24:             //获取属性描述符对象

  25:             PropertyDescriptor pd = new PropertyDescriptor(propertyName, beanClass);

  26:             //得到set方法对象

  27:             Method setMethod = pd.getWriteMethod();

  28:             //利用反射执行set方法

  29:             setMethod.invoke(obj, values);

  30:         } catch (IllegalArgumentException e) {

  31:             // TODO Auto-generated catch block

  32:             e.printStackTrace();

  33:         } catch (IntrospectionException e) {

  34:             // TODO Auto-generated catch block

  35:             e.printStackTrace();

  36:         } catch (IllegalAccessException e) {

  37:             // TODO Auto-generated catch block

  38:             e.printStackTrace();

  39:         } catch (InvocationTargetException e) {

  40:             // TODO Auto-generated catch block

  41:             e.printStackTrace();

  42:         }

  43:     }

  44:     //封装javabean的get方法

  45:     private static Object getProperty(Class beanClass,Object obj,String propertyName,Object[] args){

  46:         Object retVal = null;

  47:         try {

  48:             //获取属性描述符对象

  49:             PropertyDescriptor pd = new PropertyDescriptor(propertyName, beanClass);

  50:             //得到get方法对象

  51:             Method getMethod = pd.getReadMethod();

  52:             //利用反射执行get方法

  53:             retVal = getMethod.invoke(obj, args);

  54:         } catch (IllegalArgumentException e) {

  55:             // TODO Auto-generated catch block

  56:             e.printStackTrace();

  57:         } catch (IntrospectionException e) {

  58:             // TODO Auto-generated catch block

  59:             e.printStackTrace();

  60:         } catch (IllegalAccessException e) {

  61:             // TODO Auto-generated catch block

  62:             e.printStackTrace();

  63:         } catch (InvocationTargetException e) {

  64:             // TODO Auto-generated catch block

  65:             e.printStackTrace();

  66:         }

  67:         return retVal;

  68:     }

  69: }

利用内省实现一些复杂操作

   1: public class BeanTest2 {

   2:  

   3:     /**

   4:      * @param args

   5:      * @throws IntrospectionException 

   6:      * @throws InvocationTargetException 

   7:      * @throws IllegalAccessException 

   8:      * @throws IllegalArgumentException 

   9:      */

  10:     public static void main(String[] args) throws IntrospectionException, IllegalArgumentException, IllegalAccessException, InvocationTargetException {

  11:         

  12:         //获取对象

  13:         Bean b = new Bean("Shawn",12,1,97);

  14:         //获取类字节码文件

  15:         Class beanClass = Bean.class;    

  16:         //设置需要操作的属性名

  17:         String propertyName = "name";

  18:         

  19:         //根据类字节码对象获取Bean信息

  20:         BeanInfo beanInfo = Introspector.getBeanInfo(beanClass);

  21:         //利用内省获取所有的属性描述符

  22:         PropertyDescriptor[] pds = beanInfo.getPropertyDescriptors();

  23:         //遍历所有的属性描述符,找到要操作的属性,进行操作

  24:         for(PropertyDescriptor pd : pds){

  25:             if(pd.getName().equals(propertyName)){

  26:                 Method setMethod = pd.getWriteMethod();

  27:                 Method getMethod = pd.getReadMethod();

  28:                 System.out.println(getMethod.invoke(b, null));

  29:                 setMethod.invoke(b, "Feng");

  30:                 System.out.println(getMethod.invoke(b, null));

  31:             }

  32:         }

  33:     }

  34: }

BeanUtils工具包

BeanUtils工具包是apach提供的一套非常方便的用于操作JavaBean的工具

BeanUtil实现set和get方法

   1: public class BeanUtilTest {

   2:  

   3:     /**

   4:      * @param args

   5:      * @throws NoSuchMethodException 

   6:      * @throws InvocationTargetException 

   7:      * @throws IllegalAccessException 

   8:      */

   9:     public static void main(String[] args) throws IllegalAccessException, InvocationTargetException, NoSuchMethodException {

  10:         

  11:         //获取对象

  12:         Bean b = new Bean("Shawn",12,1,97);

  13:         //设置需要操作的属性名

  14:         String propertyName = "score";

  15:         

  16:         //利用BeanUtils获取属性值

  17:         System.out.println(BeanUtils.getProperty(b, propertyName));

  18:         //利用BeanUtils设置属性值

  19:         BeanUtils.setProperty(b, propertyName, "33");

  20:         System.out.println(BeanUtils.getProperty(b, propertyName));

  21:     }

  22: }

我们可以看到,即便操作的是int型的属性,接收的仍然是字符串数据

BeanUtils包中还提供一个类PropertyUtils,也具有setProperty与getProperty的方法,与BeanUtils不同的是,传入的参数不需要进行类型转换,也就是说,如果BeanUtils中的方法类型转换出了问题时,可以采用PropertyUtils中的方法,直接传入对应类型的参数,同样可以达到目的。

同时,BeanUtils还支持属性的级联操作

比如一个人内部有心脏,而心脏内部又有左心房和右心房,那么我们可以直接通过BeanUtils设置和获取心脏的内部属性

   1: public class Heart{

   2:     private String left;

   3:     private String right;

   4:     public String getLeft() {

   5:         return left;

   6:     }

   7:     public void setLeft(String left) {

   8:         this.left = left;

   9:     }

  10:     public String getRight() {

  11:         return right;

  12:     }

  13:     public void setRight(String right) {

  14:         this.right = right;

  15:     }

  16: }

   1: public class Person{

   2:     private Heart heart = new Heart();

   3:     private Date birthday;

   4:     public Date getBirthday() {

   5:         return birthday;

   6:     }

   7:     public void setBirthday(Date birthday) {

   8:         this.birthday = birthday;

   9:     }

  10:     public Heart getHeart() {

  11:         return heart;

  12:     }

  13:     public void setHeart(Heart heart) {

  14:         this.heart = heart;

  15:     }

  16: }

   1: public class BeanUtilsTest2 {

   2:  

   3:     /**

   4:      * @param args

   5:      * @throws NoSuchMethodException 

   6:      * @throws InvocationTargetException 

   7:      * @throws IllegalAccessException 

   8:      */

   9:     public static void main(String[] args) throws IllegalAccessException, InvocationTargetException, NoSuchMethodException {

  10:         // TODO Auto-generated method stub

  11:         Person p = new Person();

  12:         System.out.println(BeanUtils.getProperty(p, "heart.left"));

  13:         BeanUtils.setProperty(p, "heart.left", "lll");

  14:         System.out.println(BeanUtils.getProperty(p, "heart.left"));

  15:     }

  16: }

还有一个重要的操作,BeanUtils可以将Map集合对象与JavaBean对象的对应属性内容进行转换

   1: public class BeanUtilsTest3 {

   2:  

   3:     /**

   4:      * @param args

   5:      * @throws InvocationTargetException 

   6:      * @throws IllegalAccessException 

   7:      * @throws NoSuchMethodException 

   8:      */

   9:     public static void main(String[] args) throws IllegalAccessException, InvocationTargetException, NoSuchMethodException {

  10:         

  11:         //将JavaBean的属性信息映射到一个Map集合中

  12:         Map map = new HashMap();

  13:         Bean b = new Bean("Shawn", 12, 14, 90);        

  14:         map = BeanUtils.describe(b);

  15:         System.out.println(map);

  16:         

  17:         //将map集合中的属性写入到JavaBean对象中

  18:         map = new HashMap();

  19:         map.put("name", "Feng");

  20:         map.put("score", 22);        

  21:         BeanUtils.populate(b, map);

  22:         System.out.println(b.toString());

  23:     }

  24: }

以上三点便是BeanUtils最常用的一些操作和特点,可以看到,BeanUtils的操作非常方便快捷,现在已经很普及了

JavaBean的命名规则

由于JavaBean中只有set和get方法是对外可见的,所以JavaBean内部属性用什么名字并不重要,只要设置好方法名称即可

一般规则是

如果方法名称为setXxx和getXxx,那么表示propertyName全为小写xxx

如果方法名称为setXXx或者setXXX,那么表示propertyName为对应的XXx以及XXX

一般setXxx以及setXXX比较常见,一个代表普通的变量,一个代表具有特殊含义的变量

所以我们写方法名称时尽量按照这个命名规则写,设置propertyName时使用相对应的名称即可

内省与JavaBean的更多相关文章

  1. 内省(introspector)------>JavaBean

    内省(introspector)------>JavaBean    1.问什么要学内省?        开发框架时,经常需要Java对象的属性来来封装程序的数据,每次使用反射技术完成此操作过于 ...

  2. 内省、JavaBean、PropertyDescriptor类、Introspector类、BeanUtils工具包、注解、Rentention、Target、注解的基本属性和高级属性

      本文转载自:http://blog.sina.com.cn/s/blog_5d65a16901011kom.html 关键字:内省.JavaBean.PropertyDescriptor类.Int ...

  3. 内省操作javabean的属性

    import java.beans.BeanInfo; import java.beans.IntrospectionException; import java.beans.Introspector ...

  4. 由内省引出JavaBean的讲解

    IntroSpector--内部检查,了解更多细节--内省---JavaBean 一.JavaBean JavaBean是一种特殊的Java类,主要用于传递数据信息,这种java类中的方法主要用户访问 ...

  5. java 内省 了解JavaBean

    JavaBean是一种特殊的Java类,主要用于传递数据信息,这种java类中的方法主要用于访问私有的字段,且方法名符合某种命名规则. 如果要在两个模块之间传递多个信息,可以将这些信息封装到一个Jav ...

  6. 由内省引出JavaBean的应用

    IntroSpector-->javaBean-->特殊的java类 get和set方法 ReflectPoint pt1 = new ReflectPoint(3,5); String ...

  7. 使用内省的方式操作JavaBean

    import java.beans.BeanInfo; import java.beans.Introspector; import java.beans.PropertyDescriptor; im ...

  8. java 深入技术八(内省)

    1. javabean的软件设计思想 2.内省:封装了java反射,提供直接操作属性的Setter和getter方法的方法 3.核心API:BeanInfo java 的描述信息,Introspect ...

  9. 黑马程序员——【Java高新技术】——JavaBean、注解

    ---------- android培训.java培训.期待与您交流! ---------- 一.JavaBean * 通过内省引入JavaBean:内省对应的英文全程是IntroSpector.在J ...

随机推荐

  1. IntelliJ IDEA 部署Tomcat及创建一个web工程

    一.部署Tomcat 二.新建一个web工程 1.新建一个Project 2.现在建立一个简单的web工程,所以只勾选下面选中的,此外,本版本(IntelliJ IDEA 14.1.5只支持3.1版本 ...

  2. PAT-乙级-1027. 打印沙漏(20)

    1027. 打印沙漏(20) 时间限制 200 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 CHEN, Yue 本题要求你写个程序把给定的符号打印成 ...

  3. (转)基于即时通信和LBS技术的位置感知服务(二):XMPP协议总结以及开源解决方案

    在<基于即时通信和LBS技术的位置感知服务(一):提出问题及解决方案>一文中,提到尝试使用XMPP协议来实现即时通信.本文将对XMPP协议框架以及相关的C/S架构进行介绍,协议的底层实现不 ...

  4. Untiy 接入 移动MM 详解

    原地址:http://www.cnblogs.com/alongu3d/p/3627936.html Untiy 接入 移动MM 详解 第一次接到师傅的任务(小龙),准备着手写untiy接入第三方SD ...

  5. A JSTL primer, Part 2: Getting down to the core

    In the initial article of this series, you got your first look at JSTL. We described the use of its  ...

  6. Maven Source jar

    http://blog.csdn.net/symgdwyh/article/details/4407945

  7. C语言不是C++的严格子集

    C语言是C++的子集吗?C++是在C语言的基础上扩展而来并包含所有C语言的内容吗? 回复: 从实用角度讲,C++属于C语言的一个超集,基本上兼容ANSI C.但是从编译角度上讲,C语言的有些特性在C+ ...

  8. 跨平台的目录遍历实现方法(windows和linux已经测试)

    dirent.h是gcc下的一个头文件,在windows中是没有的.这个文件中封装了几个对目录进行操作函数: static DIR *opendir (const char *dirname);sta ...

  9. Android UI-开源框架ImageLoader的完美例子

    Android开源框架ImageLoader的完美例子 2013年8月19日开源框架之Universal_Image_Loader学习 很多人都在讨论如何让图片能在异步加载更加流畅,可以显示大量图片, ...

  10. String.IndexOf String.IndexOf String.Substring

    String.IndexOf String.IndexOf 方法 (Char, Int32, Int32)报告指定字符在此实例中的第一个匹配项的索引.搜索从指定字符位置开始,并检查指定数量的字符位置. ...