最近同事问到一个涉及到Java反射的问题,整理下来如下:
需求:给定父对象,和map关系如下:
MyObject1 myObject1 = new MyObject1();
Map<String, Object> resultMap = new HashMap<String,Object>();
resultMap.put("myObject1.myobject2.mysub1.name", "sub1Name");
resultMap.put("myObject1.myobject2.mysub1.password", "111111");
resultMap.put("myObject1.myobject2.mysub1.mobile", "13900000000");
resultMap.put("myObject1.myobject2.mysub2.name", "sub2Name");
resultMap.put("myObject1.myobject2.name", "object2");
myObject1 = (MyObject1)ChaletUtils.getParentObject(resultMap,myObject1);
System.out.println(myObject1.getMyobject2().getMysub1().getName());
System.out.println(myObject1.getMyobject2().getMysub1().getPassword());
System.out.println(myObject1.getMyobject2().getMysub1().getMobile());
System.out.println(myObject1.getMyobject2().getMysub2().getName());
System.out.println(myObject1.getMyobject2().getName());
写一个util方法,返回对象myObject1,同时上面的所有子对象如果没有则自动创建
util方法如下:
public static Object getParentObject(Map<String,Object> resultMap, Object myObject1){
String classMap = "";
Iterator<String> ite = resultMap.keySet().iterator();
while( ite.hasNext() ){
classMap = ite.next();
String value = (String)resultMap.get(classMap);
classMap = classMap.replace(".", ",");
String[] classes = classMap.split(",");
try {
Class temp = myObject1.getClass();
Method[] methods = temp.getDeclaredMethods();
Object[] subArray = new Object[classes.length-1];
for( int i = 0; i < subArray.length; i++ ){
if( i != subArray.length-1 ){
subArray[i] = null;
}
if( i != 0 ){
methods = subArray[i-1].getClass().getDeclaredMethods();
}
for( Method method : methods ){
if( method.getName().startsWith("set") && method.getParameterTypes().length > 0 && method.getName().substring(3).equalsIgnoreCase(classes[i+1]) ){
if( i != subArray.length -1 ){
subArray[i] = Class.forName(method.getParameterTypes()[0].getName()).newInstance();
}
if( i == 0 ){
Method getterMethod = myObject1.getClass().getMethod("get"+method.getName().substring(3), null);
if( getterMethod.invoke(myObject1, null) != null ){
subArray[i] = getterMethod.invoke(myObject1, null);
}
method.invoke(myObject1, subArray[i]);
}else if( i == subArray.length -1 ){
method.invoke(subArray[i-1], value);
}else{
Method getterMethod = subArray[i-1].getClass().getMethod("get"+method.getName().substring(3), null);
if( getterMethod.invoke(subArray[i-1], null) != null ){
subArray[i] = getterMethod.invoke(subArray[i-1], null);
}
method.invoke(subArray[i-1], subArray[i]);
}
}
}
}
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SecurityException e) {
e.printStackTrace();
} catch (NoSuchMethodException e) {
e.printStackTrace();
}
}
return myObject1;
}
分享到:
相关推荐
在"利用Java反射技术实现动态搜索所有字段"这个主题中,我们将深入探讨如何使用Java反射API来查找并操作类的所有字段。以下是一些关键知识点: 1. **反射基础**:反射始于`java.lang.Class`类,它是所有Java类的...
这需要使用`Class`类的`newInstance()`方法来创建对象,以及`Field`类的`set()`方法来设置属性值。 其次,JavaBeans规范定义了一种标准的方式来封装Java对象,使得这些对象可以被其他工具(如IDE、持久化框架等)...
通过`Class`类和`java.lang.reflect`包中的API,我们可以动态地创建对象、访问成员变量和调用方法。 在实现深拷贝时,我们通常会创建一个目标类的空实例,然后遍历原对象的所有字段,如果字段是基本类型,直接赋值...
本文将详细介绍如何利用Java反射机制来访问和操作父类的所有属性和方法。 #### 二、Java反射基础 在深入讨论如何操作父类之前,我们先简要回顾一下Java反射的基本概念: - **Class**: 每个类都有一个与之对应的`...
传统的做法是利用Java的反射API(Reflection API)来实现这种转换。反射允许我们在运行时检查类、接口、字段和方法的信息,并且能够在运行时动态地创建对象和调用方法。以下是一个简化的转换过程: 1. **解析JSON...
总结起来,`Java对象属性数据比较,返回变化数据`这个主题涉及到Java的面向对象特性,包括对象、属性、以及反射API的使用。`ObjectCompareUtil`工具类提供了一种通用的方式来比较两个对象的属性,而`...
总结来说,利用反射实现对象转JSON格式字符串涉及以下步骤: 1. 获取对象的类和所有声明的字段。 2. 使用反射访问字段并获取其值。 3. 将字段值添加到JSON映射中。 4. 如果对象有父类,递归处理父类的字段。 5. 将...
Java反射原理是Java语言提供的一种能够在运行时检查类、接口、字段和方法的能力。通过反射,我们可以动态地创建对象、访问私有成员、调用方法,甚至改变对象的状态。在Java中,`java.lang.Class`类是反射的核心,它...
在Java中,反射允许我们动态地获取类的信息,并在运行时创建对象、调用方法、访问和修改字段。在XML转换为对象的过程中,反射扮演着关键角色: 1. **Class类**: 反射的入口点是Class类,它代表Java类的元数据。通过...
在Java编程中,深度拷贝和浅拷贝是两种重要的对象复制方式,它们涉及到对象的内存管理和内存结构的复制。...但这里我们重点讨论了如何仅通过Java反射机制来实现深度拷贝,希望对理解这一概念有所帮助。
这里我们将深入探讨如何使用Java反射遍历实体类的属性和类型,并进行赋值和获取值的操作。 首先,我们需要理解Java反射的基本概念。`java.lang.reflect`包提供了几个核心类和接口,如`Class`、`Field`、`Method`和`...
在递归查找过程中,我们可以利用`java.lang.reflect`包中的类,如`Class`和`Method`,配合递归遍历来查找目标。 实际应用中,例如在进行代码审计、性能优化或者框架设计时,递归查找字段和方法的能力是必不可少的。...
通过反射,我们可以动态地创建对象、调用方法、访问字段,甚至处理私有成员,这在某些情况下非常有用,如框架开发、插件系统或者序列化/反序列化等。 反射的概念主要基于Java.lang.reflect包中的类,如Class、...
在Java编程中,Pojo(Plain Old Java Object)是一种简单的对象模型,通常用于表示数据实体。Map接口则是Java集合框架的一部分,它提供了键值对的数据存储方式,方便数据的存取。将Pojo对象转换为Map,可以简化数据...
12. **Java反射**:理解反射的概念,以及如何在运行时动态地访问类、接口、方法和字段。 通过《Head First Java 中文版》的学习,你可以系统地掌握Java编程,并具备开发实际项目的能力。书中的每个主题都通过丰富的...
在Java编程语言中,"反射拷贝属性"是一种利用反射机制来复制对象属性的技术。反射是Java提供的一种强大工具,允许程序在运行时检查和操作类、接口、字段和方法等对象。通过反射,我们可以动态地获取类的信息并操作类...
通过Class.forName()方法加载类,并使用Class的newInstance()或Constructor的newInstance()方法创建对象。如果存在依赖,就需要递归地创建依赖的Bean。 对于属性注入,内省技术发挥作用。使用PropertyDescriptor类...
- 工厂方法模式:用于创建对象的一种设计模式,通过定义一个创建对象的接口,让子类决定实例化哪一个类。 - 防御式复制:防御性编程技术之一,用于避免对象被外部修改。 第三部分:C++编程基础 1. 内存管理 - ...
这个主题的核心在于如何利用Java的反射API和DOM(Document Object Model)来实现这一过程。下面我们将深入探讨这个过程,以及相关的Java技术和知识点。 首先,`javabean`是一种遵循特定规范的Java类,它通常包含一...
这篇博客“使用XStream是实现XML与Java对象的转换(6)--持久化”深入探讨了如何利用XStream进行持久化操作,使得对象状态能够持久保存到磁盘,同时也能够从XML文档中恢复。 首先,我们需要理解XStream的核心概念。...