A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 杨浩 于 2013-1-28 15:33 编辑

内省>JavaBean,看了几次,一直迷迷糊糊的,谁理解的深刻的,可以通俗点的讲解下么?
谢谢啦!

评分

参与人数 1技术分 +1 收起 理由
冯海霞 + 1

查看全部评分

4 个回复

正序浏览
孔斌 发表于 2013-1-28 12:47
这两天我也在学习这个,以下是我对JavaBean的理解
首先,要明确JavaBean是一个类,不过这个类较比我们平时 ...

嗯嗯,谢啦,虽然版主没给你加分,不过你讲的很通俗,哈哈。
咱们力求复杂概念简单化,理解是最重要的,也容易记忆!
回复 使用道具 举报
这两天我也在学习这个,以下是我对JavaBean的理解
首先,要明确JavaBean是一个类,不过这个类较比我们平时接触的类有点特殊的地方。就是对成员变量有了个科学安全的访问和处理方法
其次,成员变量一般是定义为私有类型,其他的类的实例对象对它时不好操作的,所以添加了public类型的get和set的方法,但是命名是有一定的规则的,正如楼上代码。
最后,利用方法调用的方式来访问和改变其值。
以上是我个人的理解,不知能否对你起到帮助

评分

参与人数 1技术分 +1 收起 理由
冯海霞 + 1

查看全部评分

回复 使用道具 举报
本帖最后由 廖成 于 2013-1-28 11:30 编辑

JavaBean
  • JavaBean 是一个特殊的 Java 类,它的方法名要符合一定的规则命名。例如 get()、set() 方法。一个 JavaBean 类可以当做普通的类来使用,但是一个普通的类并不一定可以当作 JavaBean 来操作。因为它不一定符合 JavaBean 的规则。
  • 为什么使用 JavaBean?在 JavaEE 的开发中,经常要使用到 JavaBean。很多环境就要求按 JavaBean 方式进行操作。再一个就是用 jdk 提供的 API 来把类当作 JavaBean 操作起来非常方便。
  • JavaBean 是一种特殊的 Java 类。主要用于传递数据信息,这种 Java 类中的方法要用于访问私有的字段,且方法名符合某种命名规则。如果在两个模块之间传递多个信息,可以将这些信息缝扎un个到一个 JavaBean 中,这种 JavaBean 的实例对象通常称之为值对象(Value Object ,简称 VO)。这些信息在类中有私有字段来存储,如果读取或设置这些字段的值,则需要通过一些相应的方法来访问。
  • jdk 中提供了对 JavaBean 进行操作的一些 API ,这套 API 就称为内省。用内省这套 API 来操作 JavaBean 比用普通类的方式更方便。

用内省来操作 JavaBean ,先读取 JavaBean 的值,再设置 JavaBean 的属性值:
  1.     public class A {  
  2.       
  3.         public static void main(String[] args) throws Exception {  
  4.             B b = new B();  
  5.             PropertyDescriptor pd = new PropertyDescriptor("name", b.getClass()); // 属性描述符,指向某个属性  
  6.             Method m1 = pd.getWriteMethod();  
  7.             m1.invoke(b, "DrierKing_斌");  
  8.       
  9.             Method m2 = pd.getReadMethod(); // 获取get()方法  
  10.             Object obj = (Object) m2.invoke(b);  
  11.             System.out.println(obj);  
  12.         }  
  13.     }  
  14.       
  15.     class B {  
  16.       
  17.         private String name;  
  18.         private int age;  
  19.       
  20.         public String getName() {  
  21.             return name;  
  22.         }  
  23.       
  24.         public void setName(String name) {  
  25.             this.name = name;  
  26.         }  
  27.       
  28.         public int getAge() {  
  29.             return age;  
  30.         }  
  31.       
  32.         public void setAge(int age) {  
  33.             this.age = age;  
  34.         }  
  35.     }  
复制代码
按照 BeanInfo 获取类
  1.     public class A {  
  2.       
  3.         public static void main(String[] args) throws Exception {  
  4.             B b = new B();  
  5.       
  6.             BeanInfo beanInfo = Introspector.getBeanInfo(b.getClass()); // 从一个类的字节码中以 JavaBean 的方式读取类信息  
  7.             PropertyDescriptor[] getPropertyDescriptors = beanInfo  
  8.                     .getPropertyDescriptors(); // 获取这个 JavaBean 对象中的所有属性  
  9.             for (PropertyDescriptor propertyDescriptor : getPropertyDescriptors) {  
  10.                 if (propertyDescriptor.getName().equalsIgnoreCase("name")) { // 判断这个属性名是否是我们想要的  
  11.                     Method write = propertyDescriptor.getWriteMethod();  
  12.                     write.invoke(b, "DriverKing_斌");  
  13.                     Method read = propertyDescriptor.getReadMethod();  
  14.                     System.out.println(read.invoke(b, null));  
  15.                 }  
  16.             }  
  17.         }  
  18.     }  
  19.       
  20.     class B {  
  21.       
  22.         private String name;  
  23.         private int age;  
  24.       
  25.         public String getName() {  
  26.             return name;  
  27.         }  
  28.       
  29.         public void setName(String name) {  
  30.             this.name = name;  
  31.         }  
  32.       
  33.         public int getAge() {  
  34.             return age;  
  35.         }  
  36.       
  37.         public void setAge(int age) {  
  38.             this.age = age;  
  39.         }  
  40.     }  
复制代码

评分

参与人数 1技术分 +1 收起 理由
冯海霞 + 1

查看全部评分

回复 使用道具 举报
内省:通过属性操作JavaBean
不知你现在是否有jdbc或数据库的概念,比如说我现在用jdbc查出某个表的所有信息,因为我们知道数据库里的东西必须封装到对象总返回前台才能有所作用。当这个表的列名或者说别名跟我们的分装类的属性相同,我们可以循环这个数据集,由于列名跟我们的属性名相同,可以说,这个类的属性和值就是我们这个数据集的类名+数据。所以直接使用内省会更加方便。在循环的时候直接使用内省根据列名调用其write方法,这样比调用对应的setter方法更加方便。

评分

参与人数 1技术分 +1 收起 理由
冯海霞 + 1

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马