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