对于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){}
}
}
}
分享到:
相关推荐
总的来说,Java的Pojo到Map的转换是提高代码可读性和灵活性的有效手段,尤其是在JSP页面数据绑定时。通过利用反射API,我们可以轻松地实现这一转换,从而简化编程工作。当然,使用这种方式时要注意性能影响,因为...
下面是一个简单的工具类`CollectionTools`的示例代码,它使用泛型和反射实现了Map到实体的转换: ```java import java.lang.reflect.Field; import java.util.Map; public class CollectionTools { /** * 将Map...
在Go语言的开发过程中,经常需要将结构体(Struct)转换为映射(map),尤其是在与数据库交互时,许多ORM框架或数据库操作API会使用map作为参数。本文将介绍两种在Go语言中将Struct转换为map的方法,并对它们进行...
在本主题中,我们将深入探讨如何使用Java反射机制将Map转换为Java对象,同时支持Boolean和Date类型的数据。这种转换在处理JSON到对象的映射或者数据库查询结果到对象的映射时非常有用。 首先,我们需要了解Java中的...
综上所述,`reflect doc` 涉及的是 Go 语言中 `reflect` 包的使用,这个包允许程序员在运行时检查和操作类型,增强了代码的灵活性和动态性。学习和理解反射原理以及如何安全有效地使用 `reflect` 包,是提升 Go 语言...
在Java编程中,反射技术(Reflection)是一种强大的工具,它允许程序在运行时检查和操作类、接口、字段和方法的信息。本篇文章将探讨如何利用反射技术实现POJO(Plain Old Java Object)值的拷贝,这对于数据传输、...
在编程领域,反射是一种强大的机制,它允许程序在运行时检查和操作自身的结构,包括类、接口、方法和属性等。C++反射是一项相对较新的特性,首次在C++20标准中引入,目的是提高元编程的能力,使得代码更加灵活和动态...
在实际开发中,我们常常需要将Java Bean对象与Map对象之间进行转换,以便于数据的处理和传输。以下将详细介绍如何实现这种转换。 首先,让我们了解一下Java Bean。Java Bean是一种符合JavaBeans规范的Java类,它...
使用Reflect时,需要注意的是,反编译他人的代码可能涉及版权问题,除非你拥有源代码的授权或者是在进行合法的学习研究,否则应避免滥用反编译结果。此外,反编译出来的代码通常缺少注释和原始变量名,理解起来可能...
库中的`Decode`函数接收一个`map[string]interface{}`和目标结构体的指针作为参数,然后自动进行类型转换,将`map`中的数据填充到结构体中。 例如,假设我们有一个JSON字符串,解析后得到了一个`map[string]...
在C++编程中,反射(Reflection)是一种强大的技术,它允许程序在运行时检查自身,了解类型信息,访问和修改对象的属性,甚至调用方法。C++20引入了标准化的反射机制,大大增强了这一功能。而"cpp-reflect在C++17中...
本文将围绕 JBL Reflect Flow 耳机的用户配置手册进行详细的知识点总结,涵盖耳机的设计理念、功能特点、技术规格等方面。 一、设计理念 JBL Reflect Flow 耳机的设计理念是为了提供真正的无线自由,满足用户在...
Reflect Extensions是针对Unity的反射机制进行的优化和扩展,提供了更高效、更便捷的API。例如,它支持泛型方法的反射调用,避免了使用System.Reflection的复杂性和性能损失。此外,它还提供了对Unity引擎特有的属性...
Reflect Metadata API解决了这个问题,它允许我们在类、属性、方法等上添加自定义的数据,这些数据可以在运行时被查询和使用。 首先,我们需要理解元数据(Metadata)。元数据是在程序中附加的数据,它提供了关于...
在Java编程中,反射是一种强大的工具,它允许我们在运行时检查和操作类、接口、字段和方法。在给定的标题“通过java反射实现map与bean之间互转”中,我们要探讨的是如何利用Java反射机制将Map对象转换为Java Bean...
在项目中引入"Orm_Reflect_DB",你需要注意的是,反射虽然强大,但也可能导致性能问题,因为它涉及到运行时的类信息查找和动态代码执行。因此,对于性能敏感的场景,可能需要权衡是否使用反射或者如何优化反射的使用...
在压缩包中的文件“javaBean转换Map.txt”和“javaBean转换Map - 副本.txt”可能包含了具体的实现代码或使用说明。这些文件可能会提供更详细的转换逻辑,比如处理嵌套的JavaBean、处理null值、自定义转换规则等。 ...
JBL Reflect Flow用户快速说明书.pdf 从给定的文件信息中,我们可以总结出以下知识点: wireless耳机技术 * Bluetooth版本:5.0 * Bluetooth frequency:2.402 GHz – 2.480 GHz * Bluetooth传输功率: * ...
总结来说,`reflect-metadata`是一个小巧而强大的库,为JavaScript提供了元数据支持,使得我们能够在运行时进行更高级的编程,如装饰器、类型检查、依赖注入等。通过合理利用`reflect-metadata`,开发者可以编写出...
`sun.reflect`包是Java反射API的一部分,它包含了对Java类和接口的运行时表示以及动态访问的内部实现。反射允许程序在运行时检查和操作类、接口、字段和方法的信息。在`sun.reflect`包下,有诸如`ReflectPermission`...