黑马程序员----JAVASE高级部分之JavaBean与内省

来源:互联网 发布:赛迪智库待遇知乎 编辑:程序博客网 时间:2024/06/17 11:16
-------------- android培训java培训、期待与您交流! ---------------
1.JavaBean

如果你想搞清神马是内省的话,首先要先了解神马叫做javabean,javabean从字面意思上我们可以很轻松的理解出来,它是java中的一个组件,尤其在mvc开发中他是相当的重要。它充当了一个m的角色。那么javabean到底是神马东西那?其实JavaBean是一种特殊的Java类,主要用于传递数据信息,这种java类中的方法主要用于访问私有的字段,且方法名符合某种命名规则。
如果要在两个模块之间传递多个信息,可以将这些信息封装到一个JavaBean中,这种JavaBean的实例对象通常称之为值对象(Value Object,简称VO)。这些信息在类中用私有字段来存储,如果读取或设置这些字段的值,则需要通过一些相应的方法来访问,大家觉得这些方法的名称叫什么好呢?JavaBean的属性是根据其中的setter和getter方法来确定的,而不是根据其中的成员变量。如果方法名为setId,中文意思即为设置id,至于你把它存到哪个变量上,用管吗?如果方法名为getId,中文意思即为获取id,至于你从哪个变量上取,用管吗?去掉set前缀,剩余部分就是属性名,如果剩余部分的第二个字母是小写的,则把剩余部分的首字母改成小的。
通过以上可以知道:一个类被当作javaBean使用时,JavaBean的属性是根据方法名推断出来的,它根本看不到java类内部的成员变量。
以下我们写一个实际开发中标准的JavaBean的实例:
import java.io.Serializable;import java.util.Date;/** * 一下为一个实际开发标准的javabean: * javabean的条件: * 1.属性要封装 * 2.设置setter  和 getter 方法 * 3.要有一个无参的构造方法 * @author zhangyun * */public class Person implements Serializable{private String name;private int age;private Date birthday;public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}public Date getBirthday() {return birthday;}public void setBirthday(Date birthday) {this.birthday = birthday;}}

2.内省

反射技术实际是已经能够完全满足我们对javaBean的各种操作了,但是为了方便JDK还是为我们提供了一套操纵JavaBean的API,我们称这套API为内省操作(Introspector)。
在使用内省对JavaBean进行操作时,有两种方式:
第一种比较简便的:
private static void test1(Person person) throws IntrospectionException,IllegalAccessException, InvocationTargetException {PropertyDescriptor pd = new PropertyDescriptor("name", person.getClass());Method getNameMethod = pd.getReadMethod();Object retValue = getNameMethod.invoke(person);System.out.println(retValue);Method setNameMethod = pd.getWriteMethod();setNameMethod.invoke(person, "黑马程序员");System.out.println(person.getName());}
第二种是比较复杂点的:
public static void main(String[] args) throws Exception {Person person = new Person("itheima",15,new Date());String propertyName = "name";String value ="黑马程序员";BeanInfo beanInfo = Introspector.getBeanInfo(person.getClass());PropertyDescriptor[] pds = beanInfo.getPropertyDescriptors();for(PropertyDescriptor pd : pds){if(pd.getName().equals(propertyName)){pd.getWriteMethod().invoke(person,value);break;}}System.out.println(person.getName());}



3.BeanUtils

beanutils在实际开发中可以简化我们对javabean的操作。

一.BeanUtils是apache的开发库;

为了使用BeanUtils,需要导入

(1)common-logging-1.1.1.jar

(2)common-beanutils.jar

二.BeanUtils开发

(1)设置属性;
(2)注册转换器;
(3)自定义转换器;
(4)批量设置属性;
package org.xiazdong.beanutils;import java.text.ParseException;import java.text.SimpleDateFormat;import java.util.Date;import java.util.HashMap;import java.util.Map;import org.apache.commons.beanutils.BeanUtils;import org.apache.commons.beanutils.ConversionException;import org.apache.commons.beanutils.ConvertUtils;import org.apache.commons.beanutils.Converter;import org.apache.commons.beanutils.locale.converters.DateLocaleConverter;import org.junit.Test;import org.xiazdong.Person;public class Demo01 {// 设置属性@Testpublic void test1() throws Exception {Person p = new Person();BeanUtils.setProperty(p, "name", "xiazdong");BeanUtils.setProperty(p, "age", 20);System.out.println(p.getName());System.out.println(p.getAge());}// 自定义转换器@Testpublic void test2() throws Exception {Person p = new Person();ConvertUtils.register(new Converter() {@Overridepublic Object convert(Class type, Object value) {if (value == null) {return null;}if (!(value instanceof String)) {throw new ConversionException("conversion error");}String str = (String) value;if (str.trim().equals("")) {return null;}SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");try {return sdf.parse(str);} catch (ParseException e) {throw new RuntimeException(e);}}}, Date.class);BeanUtils.setProperty(p, "birth", "2011-10-10");System.out.println(p.getBirth().toLocaleString());}// 使用内置的转换器@Testpublic void test3() throws Exception {Person p = new Person();ConvertUtils.register(new DateLocaleConverter(), Date.class);BeanUtils.setProperty(p, "birth", "2011-10-10");System.out.println(p.getBirth().toLocaleString());}// 使用内置的转换器@Testpublic void test4() throws Exception {Map map = new HashMap();map.put("name", "xiazdong");map.put("age", "20");map.put("birth", "2010-10-10");ConvertUtils.register(new DateLocaleConverter(), Date.class);Person p = new Person();BeanUtils.populate(p, map);System.out.println(p.getAge());System.out.println(p.getBirth());}}

注意:在这个工具包里面我们常用的两个类分别为:
BeanUtils和PropertyUtils。其中:
其两者区别:
BeanUtils是:get属性时返回的结果为字符串,set属性时可以接受任意类型的对象,通常使用字符串。
PropertyUtils是:get属性时返回的结果为该属性本来的类型,set属性时只接受该属性本来的类型。

-------------- android培训java培训、期待与您交流! ---------------
原创粉丝点击