操纵类的属性,有两种方法

反射

内省

面向对象的编程中,对于用户提交过来的数据,要封装成一个javaBean,也就是对象

其中Bean的属性不是由字段来决定的,而是由get和Set方法来决定的

public class Person {

    private String name ;
private String password;
private int age; public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getSex()
{
return null;
}
}

对于这个Bean,表面上看来只有三个属性,name,password,age
但是

@Test
public void test() throws Exception
{
BeanInfo info = Introspector.getBeanInfo(Person.class);
PropertyDescriptor[] pds = info.getPropertyDescriptors();
for(PropertyDescriptor pd:pds){
System.out.println(pd.getName());
}
}

实际上从结果来看属性会有5个

age
class
name
password
sex

原因呢,就是属性石根据get和Set方法确定的,而所有的类都从Object继承而来,Object本身有一个属性

public final Class<?> getClass()

如果不需要父类的属性,有一个重载方法

public static BeanInfo getBeanInfo(Class<?> beanClass,  Class<?> stopClass)


内省把Bean(相当于对象)的所有属性封装在一个BeanInfo对象里,拿到了BeanInfo就相当于拿到了Bean的所有属性

得到每一个属性的元数据(是个属性数组)

得到属性的读方法和写方法

然后就可以操作读方法或者写方法

@Test
public void test() throws Exception
{
Person p = new Person();
PropertyDescriptor pd = new PropertyDescriptor("age", Person.class);
//得到写方法
Method method = pd.getWriteMethod();
method.invoke(p,48);
//得到读方法
method = pd.getReadMethod();
System.out.println(method.invoke(p, null)); }

获取属性类型

@Test
public void test() throws Exception
{
Person p = new Person();
PropertyDescriptor pd = new PropertyDescriptor("age", Person.class);
Class c = pd.getPropertyType();
System.out.println(c); }

这上面是Sun公司的一套用法,后来Apache觉得麻烦,就开发了自己的一套用法

当然,要在Eclipse里引入jar包

Commons-BeanUtils 提供对 Java 反射和自省API的包装  
commons-logging 提供了对日志实现的包装,包括log4j,jdk1.4日志类
一般的项目使用logging 包作为日志工具,Log类地方法记录日志;
BeanUtils 作bean数据提取和注射
BeanUtils的使用依赖于日志文件这个知识库,所以两个都要导入

同时在编写的时候,要导入源码(通过F2)

public static void main(String[] args) throws IllegalAccessException, InvocationTargetException{
Person p = new Person();
BeanUtils.setProperty(p, "age", “11”);
System.out.println(p.getName());
}

Person类中的age类型为int,这里给传递一个String是可以的,因为

BeanUtils支持八种基本数据类型之间的相互转化

但是如果遇到复杂类型,要注册复杂类型转化器

比如DateTime类型

public static void main(String[] args) throws IllegalAccessException, InvocationTargetException{
Person p = new Person();
BeanUtils.setProperty(p, "age", 11);
ConvertUtils.register(new Converter() {
@Override
public Object convert(Class type, Object value) {
if(value == null){
return null;
}
if( !(value instanceof String)){
throw new ConversionException("只支持String类型数据");
}
String str = (String)value;
if(str.trim().equals("")){
return null;
} SimpleDateFormat dr = new SimpleDateFormat("yyyy-MM-dd");
try{
return dr.parse(str);
}catch(ParseException e){
throw new RuntimeException(e);
}
}
}, Date.class);
BeanUtils.setProperty(p, "birthday", "1988-01-14");
System.out.println(p.getName());
}

看看register方法

public static void register(Converter converter, Class clazz) {

        ConvertUtilsBean.getInstance().register(converter, clazz);

    }

所以要实例化一个转化器

1.  对new Converter()这里用到了匿名类

2.  在使用数据value的时候,要检测,再使用

3.  抛异常:

try{
return dr.parse(str);
}catch(ParseException e){
throw new RuntimeException(e);
}

这一句话中,不能把异常直接抛给父类,因为这个匿名类是子类,是在覆盖父类的方法,子类方法不能抛比父类方法更多的异常,所以一定要抓catch
也不能使用

try{
return dr.parse(str);
}catch(ParseException e){
e.printStackTrace();
}

这样的话,会把异常直接打印在控制台上,并没有通知上一层,上一层是不知道的,会继续执行

所有的程序都不是给自己调用的,是给上一层调用的,所以出了问题一定要告诉上一层,不能直接打印在控制台上。

可以使用map

同时ConvertUtils已经实现好了一些转换器,如日期转换器

public class Demo1 {

    public static void main(String[] args) throws IllegalAccessException, InvocationTargetException{
Map map = new HashMap();
map.put("name", "aaa");
map.put("password", "123");
map.put("age", "23");
map.put("birthday", "1989-01-14"); ConvertUtils.register(new DateLocaleConverter(), Date.class); Person bean = new Person();
BeanUtils.populate(bean, map);
}
}

Java 内省 Introspector的更多相关文章

  1. Java 内省(Introspector)深入理解

    Java 内省(Introspector)深入理解 一些概念: 内省(Introspector) 是Java 语言对 JavaBean 类属性.事件的一种缺省处理方法. JavaBean是一种特殊的类 ...

  2. Java 内省(Introspector)和 BeanUtils

    人生若只如初见,何事秋风悲画扇. 概述 内省(Introspector) 是Java 语言对 JavaBean 类属性.事件的一种缺省处理方法. JavaBean是一种特殊的类,主要用于传递数据信息, ...

  3. JAVA内省(Introspector)

    什么是Java内省:内省是Java语言对Bean类属性.事件的一种缺省处理方法. Java内省的作用:一般在开发框架时,当需要操作一个JavaBean时,如果一直用反射来操作,显得很麻烦:所以sun公 ...

  4. 聊聊Java内省Introspector

    前提 这篇文章主要分析一下Introspector(内省,应该读xing第三声,没有找到很好的翻译,下文暂且这样称呼)的用法.Introspector是一个专门处理JavaBean的工具类,用来获取J ...

  5. java内省Introspector

    大纲: JavaBean 规范 内省 一.JavaBean 规范 JavaBean —般需遵循以下规范. 实现 java.io.Serializable 接口. javaBean属性是具有getter ...

  6. 【小家Spring】Spring IoC是如何使用BeanWrapper和Java内省结合起来给Bean属性赋值的

    #### 每篇一句 > 具备了技术深度,遇到问题可以快速定位并从根本上解决.有了技术深度之后,学习其它技术可以更快,再深入其它技术也就不会害怕 #### 相关阅读 [[小家Spring]聊聊Sp ...

  7. 【小家Spring】聊聊Spring中的数据绑定 --- BeanWrapper以及内省Introspector和PropertyDescriptor

    #### 每篇一句 > 千古以来要饭的没有要早饭的,知道为什么吗? #### 相关阅读 [[小家Spring]聊聊Spring中的数据转换:Converter.ConversionService ...

  8. 深入理解Java:内省(Introspector)

    深入理解Java:内省(Introspector) 内省(Introspector) 是Java 语言对 JavaBean 类属性.事件的一种缺省处理方法. JavaBean是一种特殊的类,主要用于传 ...

  9. Java:内省(Introspector)

    内省(Introspector) 是Java 语言对 JavaBean 类属性.事件的一种缺省处理方法. JavaBean是一种特殊的类,主要用于传递数据信息,这种类中的方法主要用于访问私有的字段,且 ...

随机推荐

  1. Hessian(C#)介绍及使用说明

    什么是Hessian? Hessian是Caucho开发的一种二进制Web Service协议.支持目前所有流行的开发平台. Hessia能干什么? hessian用来实现web服务. Hessia有 ...

  2. opencar二次开发常用代码

    <?php //创建Registry对象 //注册所有公共类 //创建Front类对象,作为请求分发器(Dispatcher) //根据用户请求(url)创建控制器对象及其动作. // 在Fro ...

  3. power desinger 学习笔记<八>

    转-PowerDesigner 把Comment复制到name中和把name复制到Comment 在使用PowerDesigner对数据库进行概念模型和物理模型设计时,一般在NAME或Comment中 ...

  4. Linux命令:head命令详解

    概述:head命令用于显示文件文字区块 1.格式 head [参数][文件] 2.参数 -q 隐藏文件名 -v 显示文件名 -c<字节> 显示字节数 -n<行数> 显示的行数 ...

  5. 仿小米网jQuery全屏滚动插件fullPage.js

    演 示 下 载   简介 如今我们经常能见到全屏网站,尤其是国外网站.这些网站用几幅很大的图片或色块做背景,再添加一些简单的内容,显得格外的高端大气上档次.比如 iPhone 5C 的介绍页面,QQ浏 ...

  6. 关于call 与 apply 那些事

    1.定义: call : 调用一个对象的一个方法,以另一个对象替换当前的对象. apply : 应用某一对象的一个方法,用另一个对象替换当前的对象. 2.用法: call:call(thisObj, ...

  7. Ubuntu软件包管理命令全面集锦

    说明:由于图形化界面方法(如Add/Remove... 和Synaptic Package Manageer)比较简单,所以这里主要总结在终端通过命令行方式进行的软件包安装.卸载和删除的方法. 一.U ...

  8. TatukGIS - GisDefs - DateTimeToXMLString 函数

    函数名称  DateTimeToXMLString 所在单元  GisDefs 函数原型           function DateTimeToXMLString(_dtm: TDateTime; ...

  9. RabbitMQ笔记

    RabbitMQ是一个在AMQP基础上完整的,可复用的企业消息系统.他遵循Mozilla Public License开源协议. MQ全称为Message Queue, 消息队列(MQ)是一种应用程序 ...

  10. js 外部文件加载处理

    概述 前端在日常工作中很大一部分时间是在思考页面的优化方案,让页面载入得更快.鉴于javascript是单线程的事件驱动语言,优化工作之一就是:控制图片.swf.iframe等大流量文件以及js和cs ...