一、Bean简介


1、简单概念:
符合一定特殊规则的java类就是javaBean。

2、PropertyDescriptor类:
javaBean是一中特殊的java类,主要用于传递数据信息,这种java类中的方法主要用于访问私有的字段,且方法名符合某种命名规则。如果要在两个模块之间传递多个信息,可以将这新信息封装到一个JavaBea中,这种JavaBean的实例对象通常称之为值对象(ValueObject简称VO)。

3、内省(IntroSpector):
经常听到的一句话就是“使用内省操作javaBean”。PropertyDescriptor类描述javaBean通过一对存储器方法导出一个属性,经常用于javaBean中。

4、内省操作JavaBean:
Student.java:

class Student {
	// 私有化String类型的姓名name,防止别的类创建对象使用该变量
	private String name;
	// 私有化int类型的年龄age,防止别的类创建对象使用该变量
	private int age;
	// 私有化int类型的分数score,防止别的类创建对象使用该变量
	private int score;
	// 提供set和get方法访问本类成员变量
	public void setName(String name) {
		// set姓名属性(成员变量),不能有返回值,因为前面已经定义是void类型的方法
		this.name = name;
	}
	public String getName() {
		// get姓名属性(成员变量),需要返回值,因为get方法需要返回一下成员变量
		return name;
	}
	public void setAge(int age) {
		// set年龄属性(成员变量),不能有返回值,因为前面已经定义是void类型的方法(同上)
		this.age = age;
	}
	public int getAge() {
		// get年龄属性(成员变量),需要返回值,因为get方法需要返回一下成员变量(同上)
		return age;
	}
	public void setScore(int score) {
		// set分数属性(成员变量),不能有返回值,因为前面已经定义是void类型的方法(同上)
		this.score = score;
	}
	public int getScore() {
		// get学生成绩属性(成员变量),需要返回值,因为get方法需要返回一下成员变量(同上)
		return score;
	}
	// 创建构造方法Student,其中包含“姓名”、“年龄”、“分数”三个参数
	Student(String name, int age, int score) {
		this.name = name;
		this.age = age;
		this.score = score;
	}
}

IntroSpectorDemo.java:

package com.itheima;

import java.beans.BeanInfo;
import java.beans.Introspector;
import java.beans.PropertyDescriptor;
import java.lang.reflect.Method;

public class IntroSpectorDemo {
	/**
	 * 利用内省的方式操作javaBean,首当其冲用PropertyDescriptor类
	 */
	public static void main(String[] args) throws Exception{
		// TODO Auto-generated method stub
		/*
		 * 下面这个使用的是内省的方式操作javaBean
		 * 
		 * */
		Student s=new Student("李安",22,100);
		//获取属性的名字
		String propertyName="age";
		//这个类的意思就是“属性描述符”,是用来导出javaBean类的属性来着
		PropertyDescriptor pd=new PropertyDescriptor(propertyName,s.getClass());
		//获取只读方法
		Method mGetName=pd.getReadMethod();
		//方法调用invoke返回的将是一个对象,该对象是return value
		Object retVal=mGetName.invoke(s);
		//输出一下自己需要调用的属性值
		System.out.println(retVal);
		

		/*
		 * 下面的意思就是将年龄的大小给改掉了
		 * 
		 * */		
		Method mSetAge=pd.getWriteMethod();//写方法
		Object retVal1=mSetAge.invoke(s, 7);
		System.out.println(s.getAge());
		
		
		/*
		 * 下面这个使用的是复杂的方式使用javaBean,也就是没有用“快捷类”
		 * 这种方法比较慢啊,代码比较多,前面的for循环之类的代码的都是可以使用
		 * PropertyDescriptor pd=new PropertyDescriptor(propertyName,s.getClass);
		 * 来实现的
		 * */
		
		//获取Bean信息
		BeanInfo beanInfo=Introspector.getBeanInfo(s.getClass());
		//方法getPropertyDescriptors可以返回一个getPropertyDescriptors属性的数组
		PropertyDescriptor[] pro=beanInfo.getPropertyDescriptors();
		//对象类型的retVal2初始值为空
		Object retVal2=null;

		for(PropertyDescriptor pds:pro){
			/*因为返回的是一个属性类型的数组,我们只需要指定的属性,所以名字需要判断一下
			这样就实现了相关内容的修改或者是获取*/
			if(pds.getName().equals(propertyName)){
				Method methodGetX=pds.getReadMethod();
				retVal2=methodGetX.invoke(s);
				System.out.println(retVal2);
				break;
			}
		}
	}
}

5、注意的事情:
javaBean一定可以被当作java类来操作,但是一个类不一定可以被看作javaBean来操作。获取javaBean类中的属性就是去掉类中方法名字前面的set或者get,然后如果方法名字第二个字母是小的,则把第一个字母变成小的,比方说:setAge---->age(属性)、setName-->name属性),如果第二个字母是大的,那么第一个字母保持大写,比方说:setCPU()-->CPU。


二、BeanUtils(JavaBean工具类)
1、配置工作:
(1)、首先下载BeanUtils工具类的jar包,然后再需要使用这个工具类的工程中创建一个文件夹,将下载的包copy进去,右键点击BuildPath。
(2)、这样还不行,还要下载common-logging的jar包,放到同一个文件夹中,同样使用上面的方法。

2、演示:
//就拿前面用到的Student类来讲,一个设置属性的语句,三个参数分别对应的是:类创建的对象、属性名称、属性参数
BeanUtils.setProperty(s, "age", "22");
//输出的是类对象调用自己的返回方法获取数值,通过演示可以看到这个工具类想当快捷方便
System.out.println(s.getAge());

3、BeanUtils支持java的“多级扩展”:
这是自己起的名字,意思就是说,比方说我的一个类中有一个Data类型的对象birthday,我想要获取这个对象中setTime的方法,我可以这样写:
BeanUtils.setProperty(s,"birthday.time","1991");

 

三、PropertyUtils(JavaBean工具类)
1、概念:
和BeanUtils相呼应,都是用来操作类的属性。

2、演示:
//三个参数分别代表的是“类对象”、“属性名”、“属性值”
PropertyUtils.setProperty(s,"name",9);
可以看到“属性值”又成了int类型的了。

 

四、BeanUtils和PropertyUtils的区别
1、参数类型:
(1)、BeanUtils工具类操作的时候,属性的参数使用的都是String类型。
(2)、PropertyUtils类操作的时候,属性的参数是什么类型的就是什么类型的。

2、演示:
(1)、BeanUtils:
BeanUtils.setProperty(s,"age","22");
BeanUtils.getProperty(s,"age").getClass.getName();//返回的是String类型的age。

(2)、PropertyUtils:
Property.setProperty(s,"age",22);
Property.getProperty(s,"age").getClass.getName();//返回的是int类型的age。