一、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。