`
sharong
  • 浏览: 493384 次
  • 性别: Icon_minigender_1
  • 来自: 北京
博客专栏
D1667ae2-8cfc-3b68-ac7c-5e282789fa4a
论开源
浏览量:8720
7eb53364-fe48-371c-9623-887640be0185
Spring-data-j...
浏览量:13059
社区版块
存档分类
最新评论

使用Reflect运行时进行Map和POJO的互相转换

 
阅读更多
对于java.lang.reflect.Field来说,也就是一个类的域实例,可以通过以下方式来获得:
Field[] fields = clazz.getDeclaredFields() ;
Field[] fields = clazz.getFields() ;


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

下面直接给出示例代码,代码中,flushParams方法将类(包括父类)中所有的可见属性转换为了Map中的键值对,而flushObject方法执行的是相反的操作,将Map中的键值对转换为了类(包括父类)中所有的可见属性。
public final class ReflectUtils {
	private static final Log logger = LogFactory.getLog(ReflectUtils.class);
	
	/**
	 * 将泛型形参给出的类中设置的属性值转换为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;
		
		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));
						value = method.invoke(t);

						if(logger.isDebugEnabled())
							logger.debug(ReflectUtils.class + "attribute value:" + value);
						
						if(value != null)
							params.put(name, value);
					}
				}
			} catch (Exception e) {} 	
		}
	}
	
	/**
	 * 将Map形式的键值对中的值转换为泛型形参给出的类中的属性值
	 * t一般代表pojo类
	 * 
	 * @param t
	 * @param params
	 */
	public static <T extends Object> void flushObject(T t, Map<String, Object> params) {
		if(params == null || t == null)
			return;
		
		Class<?> clazz = t.getClass() ;
		for(; clazz != Object.class ; clazz = clazz.getSuperclass()) {
			try {
				Field[] fields = clazz.getDeclaredFields() ;
				
				for(int i = 0 ; i< fields.length;i++){
					String name = fields[i].getName(); // 获取属性的名字
					
					if(logger.isDebugEnabled())
						logger.debug(ReflectUtils.class + "method flushObject attribute name:" + name + "  ");
					
					Object value = params.get(name);
					if(value != null && !"".equals(value)){
						//注意下面这句,不设置true的话,不能修改private类型变量的值
						fields[i].setAccessible(true);
						fields[i].set(t, value);
					}
				}
			}catch(Exception e){}
		}
	}	
}
2
3
分享到:
评论

相关推荐

    java Pojo转Map

    总的来说,Java的Pojo到Map的转换是提高代码可读性和灵活性的有效手段,尤其是在JSP页面数据绑定时。通过利用反射API,我们可以轻松地实现这一转换,从而简化编程工作。当然,使用这种方式时要注意性能影响,因为...

    将Map转换成Java实体

    下面是一个简单的工具类`CollectionTools`的示例代码,它使用泛型和反射实现了Map到实体的转换: ```java import java.lang.reflect.Field; import java.util.Map; public class CollectionTools { /** * 将Map...

    详解Go开发Struct转换成map两种方式比较

    在Go语言的开发过程中,经常需要将结构体(Struct)转换为映射(map),尤其是在与数据库交互时,许多ORM框架或数据库操作API会使用map作为参数。本文将介绍两种在Go语言中将Struct转换为map的方法,并对它们进行...

    使用Java反射机制将Map转换为Java对象,支持Boolean、Date类型

    在本主题中,我们将深入探讨如何使用Java反射机制将Map转换为Java对象,同时支持Boolean和Date类型的数据。这种转换在处理JSON到对象的映射或者数据库查询结果到对象的映射时非常有用。 首先,我们需要了解Java中的...

    reflect doc

    综上所述,`reflect doc` 涉及的是 Go 语言中 `reflect` 包的使用,这个包允许程序员在运行时检查和操作类型,增强了代码的灵活性和动态性。学习和理解反射原理以及如何安全有效地使用 `reflect` 包,是提升 Go 语言...

    利用反射技术实现POJO值拷贝

    在Java编程中,反射技术(Reflection)是一种强大的工具,它允许程序在运行时检查和操作类、接口、字段和方法的信息。本篇文章将探讨如何利用反射技术实现POJO(Plain Old Java Object)值的拷贝,这对于数据传输、...

    C++ reflect 反射

    在编程领域,反射是一种强大的机制,它允许程序在运行时检查和操作自身的结构,包括类、接口、方法和属性等。C++反射是一项相对较新的特性,首次在C++20标准中引入,目的是提高元编程的能力,使得代码更加灵活和动态...

    java bean和map之间的互转

    在实际开发中,我们常常需要将Java Bean对象与Map对象之间进行转换,以便于数据的处理和传输。以下将详细介绍如何实现这种转换。 首先,让我们了解一下Java Bean。Java Bean是一种符合JavaBeans规范的Java类,它...

    .NET反编译工具 Reflect

    使用Reflect时,需要注意的是,反编译他人的代码可能涉及版权问题,除非你拥有源代码的授权或者是在进行合法的学习研究,否则应避免滥用反编译结果。此外,反编译出来的代码通常缺少注释和原始变量名,理解起来可能...

    cpp-reflect在C17中轻松实现反射和序列化

    在C++编程中,反射(Reflection)是一种强大的技术,它允许程序在运行时检查自身,了解类型信息,访问和修改对象的属性,甚至调用方法。C++20引入了标准化的反射机制,大大增强了这一功能。而"cpp-reflect在C++17中...

    Go-mapstructure-Go库用于解码泛型map值成Go结构体

    库中的`Decode`函数接收一个`map[string]interface{}`和目标结构体的指针作为参数,然后自动进行类型转换,将`map`中的数据填充到结构体中。 例如,假设我们有一个JSON字符串,解析后得到了一个`map[string]...

    JBL Reflect Flow用户配置手册.pdf

    本文将围绕 JBL Reflect Flow 耳机的用户配置手册进行详细的知识点总结,涵盖耳机的设计理念、功能特点、技术规格等方面。 一、设计理念 JBL Reflect Flow 耳机的设计理念是为了提供真正的无线自由,满足用户在...

    Reflect-Extensions-reflect-extensions-public

    Reflect Extensions是针对Unity的反射机制进行的优化和扩展,提供了更高效、更便捷的API。例如,它支持泛型方法的反射调用,避免了使用System.Reflection的复杂性和性能损失。此外,它还提供了对Unity引擎特有的属性...

    前端项目-reflect-metadata.zip

    Reflect Metadata API解决了这个问题,它允许我们在类、属性、方法等上添加自定义的数据,这些数据可以在运行时被查询和使用。 首先,我们需要理解元数据(Metadata)。元数据是在程序中附加的数据,它提供了关于...

    通过java反射实现map与bean之间互转

    在Java编程中,反射是一种强大的工具,它允许我们在运行时检查和操作类、接口、字段和方法。在给定的标题“通过java反射实现map与bean之间互转”中,我们要探讨的是如何利用Java反射机制将Map对象转换为Java Bean...

    Orm_Reflect_DB

    在项目中引入"Orm_Reflect_DB",你需要注意的是,反射虽然强大,但也可能导致性能问题,因为它涉及到运行时的类信息查找和动态代码执行。因此,对于性能敏感的场景,可能需要权衡是否使用反射或者如何优化反射的使用...

    Desktop_javaBean转换Map工具_

    在压缩包中的文件“javaBean转换Map.txt”和“javaBean转换Map - 副本.txt”可能包含了具体的实现代码或使用说明。这些文件可能会提供更详细的转换逻辑,比如处理嵌套的JavaBean、处理null值、自定义转换规则等。 ...

    JBL Reflect Mini NC用户快速说明书.pdf

    本手册将指导您快速入门使用 JBL Reflect Mini NC,了解其功能和特点。 佩戴和控制 为了获得最佳的音频体验,需要正确佩戴 JBL Reflect Mini NC。将耳机戴在耳朵上,确保耳机套牢固地贴合耳朵。您可以通过手动控制...

    JBL Reflect Flow用户快速说明书.pdf

    JBL Reflect Flow用户快速说明书.pdf 从给定的文件信息中,我们可以总结出以下知识点: wireless耳机技术 * Bluetooth版本:5.0 * Bluetooth frequency:2.402 GHz – 2.480 GHz * Bluetooth传输功率: * ...

    reflectmetadata的轻量级3KES模块实现

    总结来说,`reflect-metadata`是一个小巧而强大的库,为JavaScript提供了元数据支持,使得我们能够在运行时进行更高级的编程,如装饰器、类型检查、依赖注入等。通过合理利用`reflect-metadata`,开发者可以编写出...

Global site tag (gtag.js) - Google Analytics