---------------------- <a href="http://edu.csdn.net"target="blank">ASP.Net+Android+IOS开发</a>、<a href="http://edu.csdn.net"target="blank">.Net培训</a>、期待与您交流! ----------------------
一、javaBean
1、javaBean是一种特殊的java类,主要用于传递数据信息,这种java类中的方法主要用于访问私有的 字段,且方法符合某种命名规则。
2、javaBean的使用与作用
如果要在多个模块之间传递多个信息,可以将这些信息封装到一个javaBean中,这种javaBean的实例对象通常称之为值对象(value Object;简称VO)
总结:一个类被当做javaBean使用时,javaBean属性是根据方法名推断出来的。操作者使用这个类根本看不到java类中的内部成员变量。
3、命名的规则
比如: getId()---------->属性名可以推断出:id
getCPU---------->属性名可以推断出:CPU
4、好处:
a、javaEE开发中,经常使用到javaBean,很多开发环境要求按javaBean方式进行操作
b、用内省操作javaBean比用普通类的方式操作更方便
二、内省的操作
1、内省操作的理解:
英文单词为:Introspector,意思为:内部检查、内省主要对javaBean进行操作的。当一个类满足javaBean的条件时,就可以使用内省的方式操作javaBean中的数据。
2、内省的复杂操作:
通过一个类Introsptor类中的getBeanInfo()静态方法来获取某个javaBean类的BeanInfo对象,再通过BeanInfo对象中的getPropertyDescriptor()方法获取一个属性描述其对象的数组(PropertyDescriptor[ ])再通过遍历数组,就可以获取自己想要的属性描述,
再通过数组对象中的两个方法:getReadMethod()------->返回Method对象---->invoke()读取属性值
getWriteMethod()------->返回Method对象------>invoke()设置属性。
通过Introspector类获得Bean对象的 BeanInfo,然后通过 BeanInfo 来获取属性的描述器(PropertyDescriptor )
通过这个属性描述器就可以获取某个属性对应的 getter/setter 方法,
然后通过反射机制来调用这些方法。
@Test
public void test() throws Exception {
Student st = new Student();
// 1、通过Introspector类获得Bean对象的 BeanInfo,
BeanInfo entity = Introspector.getBeanInfo(Student.class);
// 2、然后通过 BeanInfo 来获取属性的描述器( PropertyDescriptor )
PropertyDescriptor pdrs[] = entity.getPropertyDescriptors();
// 3、通过这个属性描述器就可以获取某个属性对应的 getter/setter 方法,
for (PropertyDescriptor pd : pdrs) {
System.out.println(pd.getName());
System.out.println(pd.getShortDescription());
System.out.println(pd.getDisplayName());
if (pd.getName().equals("age")) {
//age是什么类型?
Method md = pd.getWriteMethod();
md.invoke(st, 12);
}
//获取属性的类型
System.out.println(pd.getName()+""+pd.getPropertyType());
}
System.out.println(st.getAge());
}
3、 PropertyDescriptor类
这个类位于java.beans包中,该类提供了三个构造方法,如下: PropertyDescriptor(String propertyName, Class<?> beanClass) 通过调用 getFoo 和 setFoo存储器方法,为符合标准 Java约定的属性构造一个 PropertyDescriptor。 PropertyDescriptor(String propertyName, Class<?> beanClass, String readMethodName, String writeMethodName) 此构造方法带有一个简单属性的名称和用于读写属性的方法名称。 PropertyDescriptor(String propertyName, Method readMethod, Method writeMethod) 此构造方法带有某一简单属性的名称,以及用来读取和写入属性的 Method 对象。 通常我们只是用第一个构造方法,方便使用。 //简便的方法 @Test public void test1()throws Exception{ Student st = new Student(); //通过构造器 创建 PropertyDescriptor对象 PropertyDescriptor pd = new PropertyDescriptor("age", Student.class); Method md = pd.getWriteMethod(); //写操作 md.invoke(st, 120); System.out.println(st.getAge()); md = pd.getReadMethod(); int value = (Integer)md.invoke(st, null); //读操作 System.out.println(value); }
4、 开源扩展BeanUtils工具包
BeanUtils等工具包都是由阿帕奇提供的,为了便于开发。BeanUtils可以将8种基本数据类型进行自动的转换,也就是一字符串形式给,以字符串形式体现出来,因此对于非基本数据类型,就需要注册转换器Converter,这就需要ConverUtils包。
好处:
1 、提供的set或get方法中,传入的是字符串,返回的还是字符串,因为在浏览器中,用户输入到文本框的都是以字符串的形式发送至服务器上的,所以操作的都是字符串。也就是说这个工具包的内部有自动将整数转换为字符串的操作。
2 、支持属性的级联操作,即支持属性链。如可以设置:人的脑袋上的眼睛的眼珠的颜色。这种级联属性的属性连如果自己用反射,那就很困难了,通过这个工具包就可以轻松调用。
注意:
要使用BeanUtils,就要将BeanUtils包添加到build path中,还要将还要将Apache公司的logging(日志)的jar包也添加进BuildPath。
import org.apache.commons.beanutils.BeanUtils;
import org.apache.commons.beanutils.PropertyUtils;
public class BeanUtilsDemo1
{
public static void main(String[] args) throws Exception
{
Student st = new Student("heima", 24);
//使用BeanUtils的setProperty方法为p1对象的name和age属性设置值
BeanUtils.setProperty(st,"name","lili");
BeanUtils.setProperty(st,"age","25");
//使用BeanUtils的getProperty方法获取p1对象的name和age属性值
Object obj1 = BeanUtils.getProperty(st,"name");
Object obj2 = BeanUtils.getProperty(st,"age");
System.out.println(obj1);
System.out.println(obj2);
}
}
---------------------- <a href="http://edu.csdn.net"target="blank">ASP.Net+Android+IOS开发</a>、<a href="http://edu.csdn.net"target="blank">.Net培训</a>、期待与您交流! ----------------------