Map转化成JavaBean实现

  在做接口开发的时候,接收到的报文中携带了三个字段,一个是该字段在数据库中的类型,一个是该字段的名字,另一个是该字段的值,处理这种报文时用到了如下方法:

方法一、

1、 将这个报文中的数据放入Map中

2、 将Map中的数据转换成JavaBean

在将Map转化成JavaBean是用到了如下方法:

public static void convertJavaBean(Map<?, ?> map,Object thisObj)  

 {  

   Set<?> set = map.keySet(); 

   Iterator<?> iterator = set.iterator();  

   while (iterator.hasNext())  

   {  

     Object obj = iterator.next();  

     Object val = map.get(obj);  

     setMethod(obj, val, thisObj); 

   }      

 } 

 

 public static void setMethod(Object method, Object value ,Object thisObj)  

   {  

     Class<?> c;  

     try  

     {  

       c = Class.forName(thisObj.getClass().getName());  

       String met = (String) method;  

       met = met.trim();  

       if (!met.substring(0, 1).equals(met.substring(0, 1).toUpperCase()))  

       {  

         met = met.substring(0, 1).toUpperCase() + met.substring(1);  

       }  

       if (!String.valueOf(method).startsWith("set"))  

       {  

         met = "set" + met;  

       }  

       Class<?> types[] = new Class[1];  

       types[0] = Class.forName("java.lang.String");  

       Method m = c.getMethod(met, types);  

       m.invoke(thisObj, value);  

     }  

     catch (Exception e)  

     {  

       // TODO: handle exception  

       e.printStackTrace();  

     }  

   }  

方法二、

Java内省机制实现Map转换成JavaBeam

内省机制:

内省(IntroSpector)是Java 语言对 Bean 类属性、事件的一种缺省处理方法。例如类 A 中有属性 name, 那我们可以通过 getName,setName 来得到其值或者设置新的值。通过 getName/setName 来访问 name 属性,这就是默认的规则。 Java 中提供了一套 API 用来访问某个属性的 getter/setter 方法,通过这些 API 可以使你不需要了解这个规则(但你最好还是要搞清楚),这些 API 存放于包 java.beans 中,一般的做法是通过类 Introspector 的 getBeanInfo方法 来获取某个对象的 BeanInfo 信息,然后通过 BeanInfo 来获取属性的描述器(PropertyDescriptor),通过这个属性描述器就可以获取某个属性对应的 getter/setter 方法,然后我们就可以通过反射机制来调用这些方法。

我们又通常把javabean的实例对象称之为值对象(Value Object),因为这些bean中通常只有一些信息字段和存储方法,没有功能性方法。

 一个JavaBean类可以不当JavaBean用,而当成普通类用。JavaBean实际就是一种规范,当一个类满足这个规范,这个类就能被其它特定的类调用。一个类被当作javaBean使用时,JavaBean的属性是根据方法名推断出来的,它根本看不到java类内部的成员变量。去掉set前缀,然后取剩余部分,如果剩余部分的第二个字母是小写的,则把剩余部分的首字母改成小的

内省机制与反射有什么区别?

反射是获取类的字节码对象,通过字节码对象创建类的对象,调用相关方法

内省机制的核心类:

Introspector:

Introspector类为访问目标Jave Bean支持的属性、事件和方法提供了标准方法。对于属性、事件和方法中的每一类信息,Introspector会分别分析目标bean以及其父类,寻找显式或隐式信息并用其构建一个能够全面描述目标bean的BeanInfo对象。过调用Introspector.getBeanInfo()方法来获得指定类的bean信息

BeanInfo:

BeanInfo类是为了获取对bean属性的控制权。只需提供属性名和所属的bean类,就可以为每个属性构建一个PropertyDescriptor

PropertyDescriptor

PropertyDescriptor是属性描述器,通过PropertyDescriptor可以获取javabean中的定义的属性、事件和方法。

内省机制分析:

1、 通过Introspector获取JavaBean中的对象

2、 通过BeanInfo对象获取属性描述器

3、 遍历每一个属性描述器获取每个属性的名称、类型以及get和set方法

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值