java内省有什么作用_javabean以及内省技术详解

一、关于javabean

javabean是固定写法的java类

书写格式为:

1)必须有无参构造函数

2)属性必须私有, 我们称为字段

3)提供标准的getter和setter

例: name 字段 的getter: String getName() settter: void setName(String name)

javabean例子:

//快捷键是shift+alt+s

public classUser

{privateString name;private intage;publicString getName()

{returnname;

}public voidsetName(String name)

{this.name =name;

}public intgetAge()

{returnage;

}public void setAge(intage)

{this.age =age;

}

@Override//为了方便打印,添加一个toString方法

publicString toString()

{return "User [age=" + age + ", name=" + name + "]";

}

}

二、关于 内省

内省是什么?: 通过反射的方式访问javabean的技术

Jdk中的api : PropertyDescriptor类操作Bean的属性

内省的作用:我们可以去实现一种通用性

1.传统的方式去访问javabean

public classDemo1

{public static voidmain(String[] args)

{

User user=newUser();

user.setName("zhangsan");

user.setAge(19);

System.out.println(user);

}

}

2.使用内省的方式来访问javabean

public classDemo1

{public static void main(String[] args) throwsException

{

User user=newUser();//创建属性描述器

PropertyDescriptor descriptor=new PropertyDescriptor("name",User.class);//获得写方法

Method writeMethod=descriptor.getWriteMethod();//调用写方法

writeMethod.invoke(user, "lisi");

System.out.println(user);

}

}

3.简化书写,实现通用性。这里写一个通用的方法,让属性名称为一个变量,假如属性名很多的话,得到属性名后,就可以遍历,然后给他们一一的赋值,这就是内省的魅力。

如果不用反射,那么传统的方式是不可能实现通用的。

下面代码实现能够为任何的javabean赋任何的值,只有用内省的方法才可以做的到:

importjava.beans.IntrospectionException;importjava.beans.PropertyDescriptor;importjava.lang.reflect.InvocationTargetException;importjava.lang.reflect.Method;importcn.itcast.day08.domain.User;public classDemo2 {/***@paramargs

*@throwsIntrospectionException

*@throwsInvocationTargetException

*@throwsIllegalAccessException

*@throwsIllegalArgumentException*/

public static void main(String[] args) throwsException {//内省

User user= newUser();

setProperty(user,"name", "wangwu");

setProperty(user,"age", 11);

System.out.println(user);

}//实现一个通用的方法 为任意的一个javabean的任意属性赋任意值

public static void setProperty(Object bean, String fieldName, Object value) throwsException {//创建属性描述器

PropertyDescriptor descriptor = newPropertyDescriptor(fieldName, bean.getClass());//获得 写方法

Method writeMethod =descriptor.getWriteMethod();//调用 写方法

writeMethod.invoke(bean, value);

}

}

由于内省用起来特别麻烦,Apache组织开发了一套用于操作JavaBean的API,如下详讲:

三、BeanUtils工具包

Apache组织开发了一套用于操作JavaBean的API(内省)

核心类 BeanUtils

setProperty(bean, name, value)

copyProperties(target, source);

可以支持String到8中基本数据类型转换

其他引用数据类型都需要注册转换器 ConvertUtils.register(Converter, Class)

注意:1、要想使用beanutils需要导入外部的jar包:commons-beanutils-1.8.0.jar这个jar包到lib目录里面

2、BeanUtils要想使用,还需要导入一个log的jar包:commons-logging.jar

下面我们来看看BeanUtils的魅力:

使用BeanUtils来格式化日期

1.javabean

packagecn.itcast.day08.domain;importjava.util.Date;//一个javabean 是否有name属性取决于是否getter或setter方法

public classUser {private String name; //字段

private intage;privateDate birthday;publicString getName() {returnname;

}public voidsetName(String name) {this.name =name;

}public intgetAge() {returnage;

}public void setAge(intage) {this.age =age;

}publicDate getBirthday() {returnbirthday;

}public voidsetBirthday(Date birthday) {this.birthday =birthday;

}

@OverridepublicString toString() {return "User [name=" + name + ", age=" + age + "]";

}

}

2.beanutils

packagecn.itcast.day08.introspector;importjava.lang.reflect.InvocationTargetException;importjava.text.ParseException;importjava.text.SimpleDateFormat;importjava.util.Date;importorg.apache.commons.beanutils.BeanUtils;importorg.apache.commons.beanutils.ConvertUtils;importorg.apache.commons.beanutils.Converter;importorg.apache.commons.beanutils.converters.DateConverter;importorg.apache.commons.beanutils.locale.converters.DateLocaleConverter;importcn.itcast.day08.domain.User;public classDemo3 {public static void main(String[] args) throwsException {

User user= newUser();

String name= "zhangsan";

String age= "19";

String birthday= "19801122";//11/22/1980 1980 11 22//注册一个转换器

/*使用匿名内部类来注册转换器

ConvertUtils.register(new Converter() {

public Object convert(Class beanClass, Object value) {

// String -- Date

String birthday = (String) value;

SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");

try {

return sdf.parse(birthday);

} catch (ParseException e) {

return null;

}

}

}, Date.class);*/DateConverter converter= newDateConverter();

converter.setPatterns(new String[]{"yyyy-MM-dd","yyyyMMdd","MM/dd/yyyy"});

ConvertUtils.register(converter, Date.class);

String fieldName= "name";

BeanUtils.setProperty(user, fieldName, name);

BeanUtils.setProperty(user,"age", age);

BeanUtils.setProperty(user,"birthday", birthday);

System.out.println(user);

System.out.println(user.getBirthday().toLocaleString());

}

}

四. WebUtils工具类

实现任何request提交的表单封装到对应的javabean

1.用户注册jsp页面:

用户注册表单用户名年龄出生日期
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值