`

黑马程序员__内省和JavaBean

阅读更多
----------- 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”);
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics