IntroSpector,内省 主要用来对javaBean来进行操作,
JavaBean是特殊的java类,符合特定的约定规则的java类,两个模块之间要进型多个信息传递时,通常把这些信息封装到一个javaBean类中,javaBean的实例通常叫做值对象(Value Object 简写VO),这就是javaBean的作用
javaBean其实就是符合内部有get 和set方法的java类酒可以看做是javaBean类了
javaBean可以当做普通的java类来操作.普通的java类如果有getSet方法就可以当做javaBean来操作.
javaBean的属性是根据get和set方法的后缀来确定的,javaBean会把例如getAge()setAge(int age)方法存在的javaBean类看做拥有一个age属性.而不去管java类中实际定义的是什么名字.
JavaBean属性名获取规则:去掉get或者set前缀,如果第二个字母是大写的就不变是小写的就把第一个字母变成小写.例如getAge()-----属性 age
getCPU() 属性---CPU ;getClassName() ------------className;
为什么使用javaBean?
因为javaEE开发好多使用javaBean的环境,一些地方要求使用javabean来操作,你没有选择的权利
使用javaBean给获取javaBean类中的属性的带来的很大的便利,API提供了使用方便,功能强大的操作方法.JDK提供了操作javabean类的api这套API就叫内省,内省操作javaBean比普通类操作方式更加方便
Java.beans,java 中提供javaBean操作的包,常用的类就是
java.beans.PropertyDescriptor
通常用来根据属性名称获取属性的get\set方法和设置属性的GET\SET方法
PropertyDescriptor(String propertyName, Class<?> beanClass)
通过调用 getFoo 和 setFoo 存取方法,为符合标准 Java 约定的属性构造一个 PropertyDescriptor。
getReadMethod() | |
getWriteMethod() | |
void | setReadMethod(Method readMethod) |
void | setWriteMethod(Method writeMethod) |
在实际应用是可以进行封装成组合方法来进行更简单的使用.
扩展:更为复杂操作方式:
使用Introspector 类的静态方法
static BeanInfo | getBeanInfo(Class<?> beanClass) |
获得把这个类当做javaBean来看的结果,一个BeanInfo对象
在使用BeanInfo对象获得全部的属性对象
getPropertyDescriptors() |
然后遍历所有的PropertyDescriptor的名称如果和需求的属性名称相同就把这个对象取出,
然后操作方式就和使用PropertyDescriptor类的方式一致了.
两种方式:第一种是通过构造函数获得PropertyDescriptor对象
第二种是通过更为复杂的方式间接获取,
本质上是一致的.
第三方包的使用
Beanutils工具包的使用:
1.Eclipsejar包的导入:
在当前工程下创建一个lib文件夹,把jar文件copy到lib中.
在lib中将jar文件导入:右键把jar文件增加到BUild Path下
2.BeanUtils工具类细节:首先必须有loging.jar包配合使用
其次他直接操作字符串,功能强大.
因为实际web 开发中取得的一般都是字符串数据,使用这个工具操作方便的多,它返回值是字符串类型,设置值直接可以使用字符串.
3.BeanUtils工具支持级联操作.
例如某个对象pt1有个Date类型的属性birthday,Date类中有time这个属性符合Bean规则就可以直接级联设置这个time值
BeanUtils.setProperty(pt1,”birthday.time”,”101010”);
4.javaBean是可以用工具类转换成map集合的,而map集合也可以填充到javaBean中,这个应用很多.
static Map describe(Object bean)
static void populate(Object bean, Map properties)
这两个方法提供map和Bean类之间的转换
BeanUtils不仅可以操作javaBean而且可以操作map集合
5.PropertyUtils
同样拥有getPropertoy和setProperty方法但是这个类的方法是按照原来类型操作的,返回和设置只能使用属性原来的类型,如果不想进行类型转换,或者使用Beanutils转换出错可以直接使用这个工具类