内省(introspector)和javabean
2016-01-09 15:35
465 查看
1,内省和javabean
一个符合JavaBean特点的类可以当作普通类一样进行使用,但把它当JavaBean用肯定需要带来一些额外的好处,在开发中,经常要使用到JavaBean。很多环境就要求按JavaBean方式进行操作。JDK中提供了对JavaBean进行操作的一些API,这套API就称为内省。
JavaBean是一个遵循特定写法的Java类,它通常具有如下特点:
这个Java类必须具有一个无参的构造函数
属性必须私有化。
私有化的属性必须通过public类型的方法暴露给其它程序,并且方法的命名也必须遵守一定的命名规范。
虽然Sun公司在定义JavaBean规范时,允许Java开发人员把JavaBean设计得可以像Swing组件一样功能强大,但在实际的J2EE开发中,通常只使用到以上JavaBean最基本的特性。
JavaBean在J2EE开发中,通常用于封装数据,对于遵循以上写法的JavaBean组件,其它程序可以通过反射技术实例化JavaBean对象,并且通过反射那些遵守命名规范的方法,从而获知JavaBean的属性,进而调用其属性保存数据。
JavaBean的属性可以是任意类型,并且一个JavaBean可以有多个属性。每个属性通常都需要具有相应的setter、 getter方法,setter方法称为属性修改器,getter方法称为属性访问器。
属性修改器必须以小写的set前缀开始,后跟属性名,且属性名的第一个字母要改为大写,例如,name属性的修改器名称为setName,password属性的修改器名称为setPassword。
属性访问器通常以小写的get前缀开始,后跟属性名,且属性名的第一个字母也要改为大写,例如,name属性的访问器名称为getName,password属性的访问器名称为getPassword。
一个JavaBean的某个属性也可以只有set方法或get方法,这样的属性通常也称之为只写、只读属性。
不多说,上例子:
上例子
一个符合JavaBean特点的类可以当作普通类一样进行使用,但把它当JavaBean用肯定需要带来一些额外的好处,在开发中,经常要使用到JavaBean。很多环境就要求按JavaBean方式进行操作。JDK中提供了对JavaBean进行操作的一些API,这套API就称为内省。
JavaBean是一个遵循特定写法的Java类,它通常具有如下特点:
这个Java类必须具有一个无参的构造函数
属性必须私有化。
私有化的属性必须通过public类型的方法暴露给其它程序,并且方法的命名也必须遵守一定的命名规范。
虽然Sun公司在定义JavaBean规范时,允许Java开发人员把JavaBean设计得可以像Swing组件一样功能强大,但在实际的J2EE开发中,通常只使用到以上JavaBean最基本的特性。
JavaBean在J2EE开发中,通常用于封装数据,对于遵循以上写法的JavaBean组件,其它程序可以通过反射技术实例化JavaBean对象,并且通过反射那些遵守命名规范的方法,从而获知JavaBean的属性,进而调用其属性保存数据。
JavaBean的属性可以是任意类型,并且一个JavaBean可以有多个属性。每个属性通常都需要具有相应的setter、 getter方法,setter方法称为属性修改器,getter方法称为属性访问器。
属性修改器必须以小写的set前缀开始,后跟属性名,且属性名的第一个字母要改为大写,例如,name属性的修改器名称为setName,password属性的修改器名称为setPassword。
属性访问器通常以小写的get前缀开始,后跟属性名,且属性名的第一个字母也要改为大写,例如,name属性的访问器名称为getName,password属性的访问器名称为getPassword。
一个JavaBean的某个属性也可以只有set方法或get方法,这样的属性通常也称之为只写、只读属性。
不多说,上例子:
package cn.itcast.day1; 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 VarableParameter { public static void main(String[] args) throws Exception { ReflectPointTest pt1 = new ReflectPointTest(3, 5); getAllProperties(pt1); } // 通过内省取得javabean的属性值(使用PropertyDescriptor) private static Object getProperty(Object pt1, String propertyName) throws IntrospectionException, IllegalAccessException, InvocationTargetException { PropertyDescriptor pd1 = new PropertyDescriptor(propertyName, pt1.getClass()); Method methodGetX = pd1.getReadMethod(); Object retVal = methodGetX.invoke(pt1); return retVal; } // 通过内省设置javabean的属性值 private static void setProperty(Object pt1, String propertyName, Object value) throws IntrospectionException, IllegalAccessException, InvocationTargetException { PropertyDescriptor pd2 = new PropertyDescriptor(propertyName, pt1.getClass()); Method methodSetX = pd2.getWriteMethod(); methodSetX.invoke(pt1, value); } // 使用内省,得到一个javabean所有的属性及其值: private static void getAllProperties(Object pt1) throws Exception { BeanInfo beanInfo = Introspector.getBeanInfo(pt1.getClass()); PropertyDescriptor[] propDescs = beanInfo.getPropertyDescriptors(); for (PropertyDescriptor propDesc : propDescs) { String propName = propDesc.getName(); Method getMethod = propDesc.getReadMethod(); System.out.println(propName + " : " + getMethod.invoke(pt1)); } } } class ReflectPointTest { private Date birthday = new Date(); private int x; private int y; public ReflectPointTest(int x, int y) { this.x = x; this.y = y; } 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; } <span style="white-space:pre"> </span>public Date getBirthday() { <span style="white-space:pre"> </span>return birthday; <span style="white-space:pre"> </span>} <span style="white-space:pre"> </span>public void setBirthday(Date birthday) { <span style="white-space:pre"> </span>this.birthday = birthday; <span style="white-space:pre"> </span>} public String toString() { return "ReflectPointTest [x=" + x + ", y=" + y + "]"; } }2,BeanUtils操作javabean
上例子
public static void main(String[] args) throws Exception { ReflectPoint pt1 = new ReflectPoint(3,5); System.out.println(BeanUtils.getProperty(pt1, "x").getClass().getName()); BeanUtils.setProperty(pt1, "x", "9"); System.out.println(pt1.getX()); BeanUtils.setProperty(pt1, "birthday.time", "111"); System.out.println(BeanUtils.getProperty(pt1, "birthday.time")); PropertyUtils.setProperty(pt1, "x", 9); System.out.println(PropertyUtils.getProperty(pt1, "x").getClass().getName()); }
相关文章推荐
- Java泛型通配符extends与super
- eclipse自动补全代码以及jadoc文档注释
- Java类当中初始化模块
- JAVA虚拟机内存模型
- JAVAEE知识点
- java 中Json的使用
- 个人学习-java-权限管理登陆(filter)
- Java学习记录
- 利用Java的反射机制实现Bean实体与Map自动转换的工具类
- Spring表达式语言之SpEL
- Java反射
- TextView高度和文字高度不一致!美工给的尺寸在eclipse做完显示不一致的问题!
- 关于Struts2的类型转换详解
- java入门学习(2)—基本数据类型
- WebService学习总结(三)——使用JDK开发WebService(自己还未实验成功 呜呜。。。)
- Java23种设计模式学习笔记【目录总贴】
- Java泛型-类型擦除
- Java 简单登录MVC
- Spring 学习笔记(三)之注解
- Spring 学习笔记(二)