-----------
android培训、
java培训、java学习型技术博客、期待与您交流! ------------
内省Introspector
Java提供用于对JavaBean进行操作的类。
JavaBean
JavaBean是一种特殊的Java类,主要用于传输数据信息,这种java类中的方法主要用于访问私有的字段,且方法符合某种命名规则。
如果要在两个模块之间传递多个信息,可以将这些信息封装到一个JavaBean中,这种JavaBean的实例对象通常称之为值对象(Value Object,简称VO)。这些信息在类中用私有字段来存储,如果读取或设置这些字段值,则需要通过一些相应的方法来访问,大家觉得这些方法名叫什么好呢?JavaBean属性是跟据其中的setter和getter方法来确定的,而不是根据其中的成员变量。如果方法名为SetId,中文意思即为设置Id,至于你把它放到哪个变量上,用管吗?如果方法名为getId,中文意思为获取Id,至于你从哪个变量上取,用管吗、?去掉set前缀就是属性名,如果剩余部分的第二个字母是小写,则把剩余部分首字母改为小写的。
setId()属性名--->id
isLast()属性名-last
例如
class Person
{
private int age;
public int getAge()
{
return age;
}
public void setAge(int age)
{
this.age = age;
}
//Age如果第二个字母是小写的,则把第一个字母变成小写的—>age就是属性名
}
对JavaBean的简单内省操作
/**
JavaBean测试类
*/
public class ReflectPoint
{
//成员变量定义
private int x;
public int y;
//构造函数初始化x,y
ReflectPoint(int x,int y)
{
this.x = x;
this.y = y;
}
/**
x,y的setter和getter方法
*/
public int getX()
{
return x;
}
public int getY()
{
return y;
}
public void setX(int x)
{
this.x = x;
}
public void setY(int y)
{
this.y = y;
}
}
import java.lang.reflect.*;
import java.beans.*;
/**
对JavaBean的简单内省操作
*/
public class IntrospectorTest
{
public static void main(String[] args) throws Exception
{
//创建JavaBean类ReflectPoint的对象
ReflectPoint pt1 = new ReflectPoint(3,5);
/*通过JavaBean类实例对象成员x的属性值*/
String propertyName = "x";
Object reVal = getProperty(pt1,propertyName);
System.out.println(reVal);
/*修改JavaBean类的实例对象pt1的x变量的属性值*/
int value = 7;
setProperty(pt1,propertyName,value);
System.out.println(pt1.getX());
}
/*
获取指定对象的属性值
*/
private static Object getProperty(Object pt1,String propertyName) throws Exception
{
PropertyDescriptor pd = new PropertyDescriptor(propertyName,pt1.getClass());
Method methodGetX =pd.getReadMethod();
Object reVal = methodGetX.invoke(pt1);
return reVal;
}
/*
设置指定对象的属性值
*/
private static void setProperty(Object pt1,String propertyName,Object Value)throws Exception
{
PropertyDescriptor pd = new PropertyDescriptor(propertyName,pt1.getClass());
Method methodSetX = pd.getWriteMethod();
methodSetX.invoke(pt1,7);
}
}
对JavaBean的复杂内省操作
1. 获取JavaBean类的BeanInfo对象
2. 采用遍历BeanInfo所有属性方式来查看和设置某个ReflectPoint对象的x属性。在程序中把一个类当做JavaBean来看,就是调用Introspector.getBeanInfo方法,得到的BeanInfo对象封装了把这个类当做JavaBean看的结果信息。
3. 获取所有属性描述符对象数组,遍历数组,如果属性描述符名称与我们要获取属性名相同获取它的值。
//创建JavaBean类ReflectPoint的对象
ReflectPoint pt1 = new ReflectPoint(3,5);
/*通过JavaBean类实例对象成员x的属性值*/
String propertyName = "x";
BeanInfo beanInfo = Introspector.getBeanInfo(pt1.getClass());//获取BeanInfo对象
PropertyDescriptor[] pds = beanInfo.getPropertyDescriptors();//获取所有属性描述符对象
Object reVal = null;
/*遍历pds数组,如果属性描述符名称与我们要获取的属性名相同获取它的值*/
for(PropertyDescriptor pd : pds)
{
if(pd.getName().equals(propertyName))
{
Method methodGetX =pd.getReadMethod();
reVal = methodGetX.invoke(pt1);
}
}
System.out.println(reVal);
使用BeanUtils包操作JavaBean
1. 导入BeanUtils包和logging包
2. 通过setProperty(Object obj ,String propertyName)方法设置属性
3. 通过getProperty(Object obj ,String propertyName,Object value)方法获取属性值
注意:
1. PropertyUtils类也可以对property进行set和get操作
2.BeanUtils的set和get对property的操作是以字符串形式对JavaBean属性进行操作。
3..PropertyUtils的set和get方法对property的操作是以属性本身类型对JavaBean进行操作
4. BeanUtils包支持对属性的级联操作,比如Date类的time属性进行设置
例如,属性birthday是Date类型,可以BeanUtils.setProperty(pt1,birthday.time,”111”);
举例:
对ReflectPoint类对象的属性进行获取和设置
BeanUtils.setProperty(pt1,”x”,”9”);
BeaUtils.getProperty(pt1,”x”);