JavaBean的内省

1.关于JavaBean

JavaBean是一种可重复使用、跨平台的软件组件,JavaBean可分为两种:一种是有用户界面(UI,User Interface)的JavaBean,例如NetBean中的那些可视化图形界面;还有一种是没有用户界面,主要负责处理事务(如数据运算,操纵数据库)的JavaBean。JSP通常访问的是最后一种JavaBean。

JavaBean是一个特殊的Java类,其中某些方法符合某种命名的规则
例:int getAge()
    void setAge(int age)  //set,get特定的规则,用于外界的操作
基本格式:

public class ReflectPoint {
	private int x;
	public ReflectPoint(int i) {
		this.x=i;
	}
	public int getX() {
		return x;
	}

	public void setX(int x) {
		this.x = x;
	}
}

JavaBean中去掉set,get的方法名,剩下的名称就是JavaBean的属性名,JavaBean的属性名有个规则:如果第二个字母是小的,则把第一个字母变成小的。则上面ReflectPoint类作为JavaBean的属性为 x。
例:gettime属性为 time;  getTime属性为time;    getCPU 属性为CPU

2.对JavaBean的简单内省操作

如果一个类符合JavaBean的特点,那它可以当做普通的类来处理,还可以当做JavaBean来处理

package com.itcast.javabean;
      /**
       * Java类的内省
       */
public class ReflectPoint {
	private int x;
	private int y;
	public ReflectPoint(int i, int j) {
		this.x=i;
		this.y=j;
	}
	public int getX() {
		return x;
	}
	public void setX(int x) {
		this.x = x;
	}
	public int getY() {
		return y;
	}
	public void setY(int y) {
		this.y = y;
	}
}

对ReflectPoint类的内省操作:

package com.itcast.javabean;
import java.beans.IntrospectionException;
import java.beans.PropertyDescriptor;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

public class IntroSpectorTest {
	public static void main(String[] args) {
		ReflectPoint rp=new ReflectPoint(3,3);
		String propertyName="x";
		try {		
			//利用JavaBean获取一个值
			Object retVal=getProperty(rp, propertyName);
			System.out.println(retVal);
			
			System.out.println(getProperty(rp, propertyName));
			 //利用JavaBean设置一个值
			setProperty(rp, propertyName, 60);
			System.out.println(rp.getX());
			Object value=90;
			setProperty(rp, propertyName, value);
			System.out.println(rp.getX());
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
	public static void setProperty(Object obj, String propertyName,
			Object value) throws IntrospectionException,
			IllegalAccessException, InvocationTargetException {
		//PropertyDescriptor类,属性描述符
		PropertyDescriptor pd1;
		//第一个参数是属性名,第二个参数是要当做JavaBean的类
		pd1=new PropertyDescriptor(propertyName, obj.getClass());
		//获取JavaBean的写入方法,即X属性的写,set方法
		Method methodSet=pd1.getWriteMethod();
		//第一个参数是指在pd1上面调用,调用时set方法接受参数
		methodSet.invoke(obj, value);
	}

	public static Object getProperty(Object obj, String propertyName)
			throws IntrospectionException, IllegalAccessException,
			InvocationTargetException {
		//PropertyDescriptor类,属性描述符
		PropertyDescriptor pd;
	    //第一个参数是属性名,第二个参数是要当做JavaBean的类
		pd=new PropertyDescriptor(propertyName, obj.getClass());
		//获取JavaBean的只读方法,即X属性的读,get方法
		Method methodGet=pd.getReadMethod();
		//第一个参数是指在pd上面调用,调用时get方法不接受参数
		Object retVal=methodGet.invoke(obj);
		return retVal;
	}
}

3.对JavaBean的复杂内省操作

IntroSpector类的静态方法getBeanInfo方法,返回BeanInfo对象,就是把这个类当作JavaBean看的结果信息。然后遍历BeanInfo的所有属性方式,查找和设置某个JavaBean对象的属性。

package com.itcast.javabean;
import java.beans.BeanInfo;
import java.beans.IntrospectionException;
import java.beans.Introspector;
import java.beans.PropertyDescriptor;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

public class IntroSpectorTest2 {
	public static void main(String[] args) {
		ReflectPoint rp = new ReflectPoint(3, 3);
		String propertyName = "x";
		try {
			// 利用JavaBean获取一个值
			Object retVal = getProperty(rp, propertyName);
			System.out.println(retVal);
			
			System.out.println(getProperty(rp, propertyName));
			// 利用JavaBean设置一个值
			setProperty(rp, propertyName, 60);
			System.out.println(rp.getX());
			Object value = 90;
			setProperty(rp, propertyName, value);
			System.out.println(rp.getX());
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	public static void setProperty(Object obj, String propertyName, Object value)
			throws IntrospectionException, IllegalAccessException,
			InvocationTargetException {
		 BeanInfo beanInfo = Introspector.getBeanInfo(obj.getClass());
	     PropertyDescriptor[] pds = beanInfo.getPropertyDescriptors();
	     for(PropertyDescriptor pd : pds){
           if(pd.getName().equals(propertyName)){
              Method methodSetX = pd.getWriteMethod();
              methodSetX.invoke(obj,value);
              break;
            }
	     }
	}

	public static Object getProperty(Object obj, String propertyName)
			throws IntrospectionException, IllegalAccessException,
			InvocationTargetException {
		BeanInfo beanInfo = Introspector.getBeanInfo(obj.getClass());
		// 将获取的作为JavaBean类的class文件转为BeanInfo,BeanInfo代表了JavaBean的信息
		PropertyDescriptor[] pds = beanInfo.getPropertyDescriptors();
		// BeanInfo 只能得到所有的属性描述,不能指定单个的,所以只能放在数组里面
		Object retVal = null;
		for (PropertyDescriptor pd : pds) {// 对属性数组进行迭代
			if (pd.getName().equals(propertyName)) {// 将获取每一个属性的名字,与要查找的属性进行比较
				Method methodGetX = pd.getReadMethod();
				retVal = methodGetX.invoke(obj);
				break;
			}
		}
		return retVal;
	}
}

JavaBean的内省_第1张图片

4.BeanUtils工具包对JavaBean操作

实验环境配置信息如图:

BeanUtils工具Jar官网

commons-logging相关jar文件

package com.itcast.javabean;
import org.apache.commons.beanutils.BeanUtils;
public class IntroSpectorTest {
	public static void main(String[] args) {
		ReflectPoint rp=new ReflectPoint(3,3);
		String propertyName="x";
		try {		
			//利用JavaBean获取一个值
			Object retVal=BeanUtils.getProperty(rp, propertyName);
			System.out.println(retVal);
			System.out.println(BeanUtils.getProperty(rp, propertyName));
			 //利用JavaBean设置一个值
			BeanUtils.setProperty(rp, propertyName, 60);
			System.out.println(rp.getX());
			Object value=90;
			BeanUtils.setProperty(rp, propertyName, value);
			System.out.println(rp.getX());
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}

实验结果如图:

JavaBean的内省_第2张图片


end...............................

你可能感兴趣的:(JavaBean的内省)