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
如果一个类符合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; } }
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; } }
实验环境配置信息如图:
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(); } } }
实验结果如图:
end...............................