JavaBean和内省

来源:互联网 发布:数控滚齿机编程 编辑:程序博客网 时间:2024/05/20 21:58

如要转载请标明作者zjrodger和出处:http://blog.csdn.net/zjrodger/,谢谢微笑

                                                                   笔记目录

(·) 由内省引出JavaBean的讲解
(·) BeanUtils工具包操作JavaBean
    1. BeanUtils工具包的安装和配置
    2. common-logging日志开发包的安装和配置
    3. 常见错误——要操作的那个目标Bean类必须是public的



(·) 由内省引出JavaBean的讲解
1. 什么是JavaBean
    JavaBean是一种Java的特殊类,主要用于传递数据,这种类中的方法主要用于访问private字段,而且方法名是符合某种命名规范来命名的。
比如:
class Person{
    private int age;
    public Person(){......}
    int getAge(){}
    void setAge(int age){}
}
Person类的定义就是一个典型的JavaBean。

注意
(1)JavaBean的一个重要特性,JavaBean必须要有一个无参构造器。
“内省”主要用于对JavaBean的操作
Introspector--------> JavaBean -------> 特殊的Java类

2. 何为内省
JDK中提供了对JavaBean进行操作的一些API,这套API就称为内省。

3. PropertiyDescriptor
    Construct a PropertyDescriptor for a property that follows the Java Standard Convention by having getFoo and setFoo
accessor methods. 
(1) 代码示例:
package com.zjrodger;import java.beans.IntrospectionException;import java.beans.PropertyDescriptor;import java.lang.reflect.InvocationTargetException;import java.lang.reflect.Method;/** * 内省的简单应用。 * **/class Person04{private int age;private String name;public Person04(){}public Person04(String name, int age){this.name = name;this.age = age;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}public String getName() {return name;}public void setName(String name) {this.name = name;}}public class Introspector {public static void main(String[] args) {try {Person p1 = new Person("zjrodger",26);String propertyName = "age";PropertyDescriptor pd = new PropertyDescriptor(propertyName, p1.getClass());Method readMethod =  pd.getReadMethod();Object returnedValue = readMethod.invoke(p1, null);System.out.println(returnedValue);Method writeMethod = pd.getWriteMethod();writeMethod.invoke(p1, 20);Method readMethod02 =  pd.getReadMethod();Object returnedValue02 = readMethod02.invoke(p1, null);System.out.println(returnedValue02);System.out.println(p1.getAge());} catch (IntrospectionException e) {e.printStackTrace();}  catch (IllegalArgumentException e) {e.printStackTrace();} catch (IllegalAccessException e) {e.printStackTrace();} catch (InvocationTargetException e) {e.printStackTrace();}}}



(·) BeanUtils工具包操作JavaBean
1. BeanUtils工具包的安装和配置
(1在Apache官方上下载BeanUtils工具包,
下载链接:http://commons.apache.org/proper/commons-beanutils/download_beanutils.cgi
(2通过MyEclipse,在自己某个项目工程目录下创建一个名为lib的文件夹,并且将新下载的工具解压缩,然后将解压缩后的“commons-beanutils-1.9.2.jar”拷贝到lib文件夹下边。
如下图所示:

  若通过“propertyes---->Add External Jars”的方法,则在自己的主机上可以成功使用该工具,若要在其他的主机上,则不能使用该工具,因为“Add External Jars”方法,只是将BeanUtils位于本地磁盘的路径传给了MyEclipse,并没有将BeanUtils工具拷贝到项目的工程中。
(3将复制到项目工程中的commons-beanutils-1.9.2.jar包添加到“Build Path”中去。
具体做法如下图所示:

(3.1) 步骤:右击“commons-beanutils-1.9.2.jar”--------> Build Path --------> Add to Build Path
(3.2) 结果:commons-beanutils-1.9.2.jar的图标会改变。
A.原来的图标:
B.加入到Build Path后的图标

多了一个Referenced Libraries并且下边多了一个文件。

2. common-logging日志开发包的安装和配置
【错误再现】
   在运行代码"BeanUtils.getProperty(p1, "age")"时,出现下述错误:
错误信息:Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/commons/logging/LogFactory
【原因分析】
    缺少日志开发包(logging包),该包是Apache提供的。在开发Spring,Struts,Hibernate时会经常使用日志开发包。
【解决方案】
    下载common-logging工具包,并且在MyEclipse/Eclipse中进行相关配置。
    (1在Apache官方上下载common-logging工具包,
       下载地址:http://commons.apache.org/proper/commons-logging/download_logging.cgi
    (2通过MyEclipse中,在自己某个项目工程目录下创建一个名为lib的文件夹,并且将新下载的工具解压缩,然后将解压缩后的“commons-beanutils-1.9.2.jar”拷贝到lib文件夹下边。
【参考文档】
1. Jakarta-Common-BeanUtils研究心得:
http://sunxboy.iteye.com/blog/149864

3. 常见错误——要操作的那个目标Bean类必须是public的
【错误再现】
    1. BeanUtils工具包的安装和配置正确。
    2. common-logging日志开发包的安装和配置。
    3. 作为Bean类的Person04的属性和方法的定义均符合JavaBean的规范。
    4. 作为Bean类的Person04和BeanUtilsTest类写在了同一个名为BeanUtilsTest的java文件中。
    5. 在运行代码"BeanUtils.getProperty(p1, "age")"时,出现下述错误:
java.lang.NoSuchMethodException: Property 'name' has no getter method in class 'class com.zjrodger.Person04'
【错误代码】
package com.zjrodger;import java.beans.IntrospectionException;import java.beans.PropertyDescriptor;import java.lang.reflect.InvocationTargetException;import java.lang.reflect.Method;import org.apache.commons.beanutils.BeanUtils;/** * 内省的简单应用。 * **/class Person04{private int age;private String name;public Person04(){}public Person04(String name, int age){this.name = name;this.age = age;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}public String getName() {return name;}public void setName(String name) {this.name = name;}}public class BeanUtilsTest {public static void main(String[] args) {try {Person04 p1 = new Person04("aaa",8);String propertyName = "name";System.out.println("name = "+BeanUtils.getProperty(p1, propertyName));} catch (IllegalAccessException e) {e.printStackTrace();} catch (InvocationTargetException e) {e.printStackTrace();} catch (NoSuchMethodException e) {e.printStackTrace();}}}
【原因分析】
    不是因为这两个类不能同一个源文件,而是因为那个方法要传递的参数对象必须是public的,还是要谢谢你。
    即,要操作的那个目标Bean类必须是public的。
    应该把Person04类的定义写在另一个java文件中,根据Bean的规范,每一个Bean类都应该单独写在一个java文件中








0 0