您的位置:首页 > 移动开发 > Objective-C

反射运用之Object和Map转换

2018-12-02 15:55 309 查看

包含了属性名称和注解成员作为key两种Map

Object=>Map

package util;

import java.lang.reflect.Field;
import java.util.HashMap;
import java.util.Map;

public class FieldMapAssembler {
/**
* 将传入的对象转换为属性名称到值的映射
* @param srcObj 对象
* @return 属性名称到值的映射
*/
public static <T> Map<String,Object> assembleFieldNameMapByObject(T srcObj) {
Map<String,Object> targetMap = new HashMap<>();
try {
Class<?> srcClazz=srcObj.getClass();
Field[] fields = srcClazz.getDeclaredFields();
for(Field field:fields) {
field.setAccessible(true);
String fieldName = field.getName();
Object fieldValue=field.get(srcObj);
targetMap.put(fieldName, fieldValue);
}
return targetMap;
} catch (IllegalAccessException | SecurityException e) {
e.printStackTrace();
return null;
}
}
/**
* 将传入的对象转换为属性数据库名称到值的映射
* @param srcObj 对象
* @return 属性数据库名称到值的映射
*/
public static <T> Map<String,Object> assembleDbNameMapByObject(T srcObj) {
Map<String,Object> targetMap = new HashMap<>();
try {
Class<?> srcClazz=srcObj.getClass();
Field[] fields = srcClazz.getDeclaredFields();
for(Field field:fields) {
field.setAccessible(true);
FieldAnnotation fieldAnno = field.getAnnotation(FieldAnnotation.class);
if(fieldAnno==null) continue;
String dbFieldName = fieldAnno.dbName();
if(dbFieldName==null) continue;
String fieldName = field.getName();
Object fieldValue=field.get(srcObj);
targetMap.put(fieldName, fieldValue);
}
return targetMap;
} catch (IllegalAccessException | SecurityException e) {
e.printStackTrace();
return null;
}
}
}

Map=>Object

package util;

import java.lang.reflect.Field;
import java.util.Map;

public class ObjectAssembler{
/**
* 将传入的MAP转换为对象
* @param fieldNameToValueMap 属性名称到值的映射
* @param targetClazz 目标Class对象
* @return 目标对象
*/
public static <T> T assembleByFieldNameMap(Map<String,Object> fieldNameToValueMap,Class<T> targetClazz) {
try {
T targetObj=targetClazz.newInstance();
Field[] fields = targetClazz.getDeclaredFields();
for(Field field:fields) {
field.setAccessible(true);
String fieldName = field.getName();
Object fieldValue=fieldNameToValueMap.get(fieldName);
if(fieldValue!=null) {
field.set(targetObj, fieldValue);
}
}
return targetObj;
} catch (InstantiationException | IllegalAccessException | SecurityException e) {
e.printStackTrace();
return null;
}
}
/**
* 将传入的MAP转换为对象
* @param dbNameToValueMap 属性在数据中名称到值的映射
* @param targetClazz 目标Class对象
* @return 目标对象
*/
public static <T> T assembleByDbAnnotationNameMap(Map<String,Object> dbNameToValueMap,Class<T> targetClazz) {
try {
T targetObj=targetClazz.newInstance();
Field[] fields = targetClazz.getDeclaredFields();
for(Field field:fields) {
field.setAccessible(true);
FieldAnnotation fieldAnno = field.getAnnotation(FieldAnnotation.class);
if(fieldAnno==null) continue;
String dbFieldName = fieldAnno.dbName();
if(dbFieldName==null) continue;
Object fieldValue=dbNameToValueMap.get(dbFieldName);
if(fieldValue==null) continue;
field.set(targetObj, fieldValue);
}
return targetObj;
} catch (InstantiationException | IllegalAccessException | SecurityException e) {
e.printStackTrace();
return null;
}
}
}

注解

package util;

import static java.lang.annotation.RetentionPolicy.RUNTIME;
import java.lang.annotation.ElementType;

import java.lang.annotation.Retention;
import java.lang.annotation.Target;

@Retention(RUNTIME)
@Target( {ElementType.FIELD} )
public @interface FieldAnnotation {
String dbName();
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: