JavaBean和内省

如要转载请标明作者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工具包,
(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工具包,
    (2通过MyEclipse中,在自己某个项目工程目录下创建一个名为lib的文件夹,并且将新下载的工具解压缩,然后将解压缩后的“commons-beanutils-1.9.2.jar”拷贝到lib文件夹下边。
【参考文档】
1. Jakarta-Common-BeanUtils研究心得:

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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值