当前位置 > 主页 > 万和大讲堂 >


使用Java反射机制运行时进行Map和POJO的互相转换

2016-02-02 10:47

  对于java.lang.reflect.Field来说,也就是一个类的域实例,可以通过以下方式来获得:

 

  Field[] fields = clazz.getDeclaredFields() ;

 

  Field[] fields = clazz.getFields() ;

 

  getDeclaredFields方法可以获得类中任何可见性的属性但不包括父类,而getFields方法只能获得包括父类的public属性。南京Java软件培训

 

  那么就存在这样一个问题,如果想获得包括父类的全部可见性属性的Field实例,该怎么办呢?同样,还有一个问题,运行时状态下,想将Map中的键值对映射到类的属性上,又该怎么办呢?

 

  下面直接给出示例代码,代码中,flushParams方法将类(包括父类)中所有的可见属性转换为了Map中的键值对,而flushObject方法执行的是相反的操作,将Map中的键值对转换为了类(包括父类)中所有的可见属性。南京Java软件培训

 

  public final class ReflectUtils {

 

  private static final Log logger = LogFactory.getLog(ReflectUtils.class);

 

  /** 南京Java软件培训

 

  * 将泛型形参给出的类中设置的属性值转换为Map形式的键值对

 

  * t一般是pojo类

 

  *

 

  * @param params

 

  * @param t

 

  */

 

  public static <T extends Object> void flushParams(Map<String, Object> params,T t) {

 

  if(params == null || t == null)

 

  return; 南京Java软件培训

 

  Class<?> clazz = t.getClass() ;

 

  for(; clazz != Object.class ;

 

  clazz = clazz.getSuperclass()) {

 

  try {

 

  Field[] fields = clazz.getDeclaredFields() ;

 

  for (int j = 0; j < fields.length; j++) { // 遍历所有属性

 

  String name = fields[j].getName(); // 获取属性的名字

 

  Object value = null;

 

  if(logger.isDebugEnabled())

 

  logger.debug(ReflectUtils.class + "method flushParams attribute name:" + name + "  ");

 

  if(!Domain.serialVersionUID.equals(name)){

 

  Method method = t.getClass()。getMethod("get" + name.substring(0, 1)。toUpperCase() + name.substring(1)); 南京Java软件培训

 

  value = method.invoke(t);

 

  if(logger.isDebugEnabled())

 

  logger.debug(ReflectUtils.class + "attribute value:" + value);

 

  if(value != null)

 

  params.put(name, value);

 

  }

 

  }

 

  } catch (Exception e) {}

 

  }

 

  }

 


最近开班 more>
  • 全栈开发
  • 前端基础班
  • 软件测试
  • Java大数据开发工程师
  • 云原生精英班
  • 开发课程基础班第四期
  • 开发课程基础班第三期
  • 开发课程基础班第二期
  • 开发课程基础班第一期
  • Java Web UI Python
  • CISP
  • HCIE-Datacom(HCIA,HCIP基础)
  • HCIP-Datacom(HCIA基础)
  • HCIA-Datacom(0基础)
  • HCIE-Datacom(HCIA,HCIP基础)
  • HCIP-Datacom(HCIA基础)
  • HCIA-Datacom(0基础)
  • OCM 12C
  • OCP 19C
  • RHCE 9.0
  • 脱产班
  • 脱产班
  • 脱产班
  • 脱产班
  • 脱产班
  • 脱产班
  • 脱产班
  • 脱产班
  • 脱产班
  • vip班
  • 考试计划
  • 脱产班
  • 脱产班
  • 脱产班
  • 双休班
  • 双休班
  • 双休班
  • 双休班
  • 业余班
  • 业余班
  • 10月16日
  • 9月23日
  • 9月2日
  • 9月30日
  • 8月26日
  • 10月8日
  • 9月23日
  • 9月16日
  • 9月9日
  • 随时开课
  • 9月21日
  • 10月17日
  • 9月18日
  • 9月2日
  • 11月2日
  • 10月26日
  • 9月7日
  • ——
  • 随时开课
  • 9月26日
    • 姓 名 :
    • 电 话 :
    • 课 程 :

技术交流群

  • Java大数据交流群560819979加入
  • Python技术交流群595083299加入
  • Oracle技术交流群595119011加入
  • Web前端技术交流群604697610加入
  • Huawei技术交流群482919361加入
  • Redhat技术交流群587875348加入
  • UI设计技术交流群511649801加入
  • Cisco技术交流群596886705加入
  • IT运维技术交流群605888381加入