propertydescriptor,propertydescriptor获取字段的注解

http://www.itjxue.com  2023-01-21 12:16  来源:未知  点击次数: 

如何把Map转换成Bean

在做导入的时候,遇到了需要将map对象转化 成javabean的问题,也就是说,不清楚javabean的内部字段排列,只知道map的 key代表javabean的字段名,value代表值。

那现在就需要用转化工具了。是通用的哦!

首先来看 JavaBean 转化成Map的方法:

[java] view plaincopy

[java]

/**

* 将一个 JavaBean 对象转化为一个 Map

* @param bean 要转化的JavaBean 对象

* @return 转化出来的 Map 对象

* @throws IntrospectionException 如果分析类属性失败

* @throws IllegalAccessException 如果实例化 JavaBean 失败

* @throws InvocationTargetException 如果调用属性的 setter 方法失败

*/

@SuppressWarnings({ "rawtypes", "unchecked" })

public static Map convertBean(Object bean)

throws IntrospectionException, IllegalAccessException, InvocationTargetException {

Class type = bean.getClass();

Map returnMap = new HashMap();

BeanInfo beanInfo = Introspector.getBeanInfo(type);

PropertyDescriptor[] propertyDescriptors = beanInfo.getPropertyDescriptors();

for (int i = 0; i propertyDescriptors.length; i++) {

PropertyDescriptor descriptor = propertyDescriptors[i];

String propertyName = descriptor.getName();

if (!propertyName.equals("class")) {

Method readMethod = descriptor.getReadMethod();

Object result = readMethod.invoke(bean, new Object[0]);

if (result != null) {

returnMap.put(propertyName, result);

} else {

returnMap.put(propertyName, "");

}

}

}

return returnMap;

}

下面是将Map转化成JavaBean对象的方法:

[java] view plaincopy

[java]

/**

* 将一个 Map 对象转化为一个 JavaBean

* @param type 要转化的类型

* @param map 包含属性值的 map

* @return 转化出来的 JavaBean 对象

* @throws IntrospectionException 如果分析类属性失败

* @throws IllegalAccessException 如果实例化 JavaBean 失败

* @throws InstantiationException 如果实例化 JavaBean 失败

* @throws InvocationTargetException 如果调用属性的 setter 方法失败

*/

@SuppressWarnings("rawtypes")

public static Object convertMap(Class type, Map map)

throws IntrospectionException, IllegalAccessException,

InstantiationException, InvocationTargetException {

BeanInfo beanInfo = Introspector.getBeanInfo(type); // 获取类属性

Object obj = type.newInstance(); // 创建 JavaBean 对象

// 给 JavaBean 对象的属性赋值

PropertyDescriptor[] propertyDescriptors = beanInfo.getPropertyDescriptors();

for (int i = 0; i propertyDescriptors.length; i++) {

PropertyDescriptor descriptor = propertyDescriptors[i];

String propertyName = descriptor.getName();

if (map.containsKey(propertyName)) {

// 下面一句可以 try 起来,这样当一个属性赋值失败的时候就不会影响其他属性赋值。

Object value = map.get(propertyName);

Object[] args = new Object[1];

args[0] = value;

descriptor.getWriteMethod().invoke(obj, args);

}

}

return obj;

springbean生命周期

Spring的生命周期是指实例化Bean时所经历的一系列阶段,即通过getBean()获取bean对象及设置对象属性时,Spring框架做了哪些事。Bean的生命周期从Spring容器实例化Bean到销毁Bean。

本文分别对 BeanFactory 和 ApplicationContext 中的生命周期进行分析。

一、BeanFactory实例化Bean相关接口

Bean级生命周期接口:(4个)

1、BeanNameAware

//待对象实例化并设置属性之后调用该方法设置BeanName

void setBeanName(String beanName);

2、BeanFactoryAware

//待调用setBeanName之后调用该方法设置BeanFactory,BeanFactory对象默认实现类是DefaultListableBeanFactory

void setBeanFactory(BeanFactory var1) throws BeansException;

3、InitializingBean

//实例化完成之后调用(调用了BeanPostProcessor.postProcessBeforeInitialization方法之后调用该方法)

void afterPropertiesSet() throws Exception;

4、DisposableBean

//关闭容器时调用

void destroy() throws Exception;

这4个接口都在包 org.springframework.beans.factory 下,它们是Bean级生命周期接口,这些接口由Bean类直接实现。

容器级Bean生命周期接口:(2个)

1、抽象类:InstantiationAwareBeanPostProcessorAdapter

实例化前/后,及框架设置Bean属性时调用该接口。可覆盖的常用方法有:

//在Bean对象实例化前调用

@Override

public Object postProcessBeforeInstantiation(Class? beanClass, String beanName) throws BeansException;

//在Bean对象实例化后调用(如调用构造器之后调用)

@Override

public boolean postProcessAfterInstantiation(Object bean, String beanName) throws BeansException;

/**

* 在设置某个属性前调用,然后再调用设置属性的方法

* 注意:这里的设置属性是指通过配置设置属性,直接调用对象的setXX方法不会调用该方法,如bean配置中配置了属性address/age属性,将会调用该方法

* @param pvs 如 PropertyValues: length=2; bean property 'address'; bean property 'age'

*/

@Override

public PropertyValues postProcessPropertyValues(PropertyValues pvs, PropertyDescriptor[] pds, Object bean, String beanName) throws BeansException;

2、接口BeanPostProcessor

实例化完成之后调用该接口。可实现的接口方法有:

//实例化完成,setBeanName/setBeanFactory完成之后调用该方法

public Object postProcessBeforeInitialization(Object o, String s) throws BeansException;

//全部是实例化完成以后调用该方法

public Object postProcessAfterInitialization(Object o, String s) throws BeansException;

这两个接口都在包 org.springframework.beans.factory.config 下,一般称它们的实现类为“后处理器”。后处理器接口一般不由Bean本身实现,实现类以容器附加装置的形式注册到Spring容器中。

当Sprig容器创建任何Bean的时候,这两个后处理器都会发生作用,所以这两个后处理器的影响是全局的。用户可以通过合理的代码控制后处理器只对固定的Bean创建进行处理。

Bean级生命周期接口解决Bean个性化处理的问题,Bean容器级生命周期接口解决容器中某些Bean共性化处理的问题。

类包含同类对象的属性名

类包含同类对象的属性名:使用BeanCopier,BeanCopier是属于cglib包里的API。

struct Test2{Test1 test1 ;Test2(Test1 t1):test1(t1){}}使用同样的调用代码,输出结果如下:Construct Test1Copy constructor for Test1。

import java.beans.BeanInfo。

import java.beans.IntrospectionException。

import java.beans.Introspector。

import java.beans.PropertyDescriptor。

类结构体异同:

C++增加了class类型后,仍保留了结构体类型(struct ),而且把它的功能也扩展了。C++允许用struct来定义一个类型。如可以将前面用关键字class声明的类类型改为用关键字struct。

为了使结构体类型也具有封装的特征,C++不是简单地继承C的结构体,而是使它也具有类的特点,以便于用于面向对象程序设计。

用struct声明的结构体类型实际上也就是类。用struct声明的类,如果对其成员不作private或public的声明,系统将其默认为public。

(责任编辑:IT教学网)

更多

推荐XML/XSLT文章