java中map转对象的方法,总结

/**
	 * map转对象方法
	 * 
	 * @param entity
	 * @param params
	 * @return
	 */
	public static <T> T mapToObjModle(T entity, Map<String, Object> params) {
		Class<?> clazz = entity.getClass();
		// 得到对象的字段
		List<Field> fields = getAccessibleFields(clazz);
		// 迭代字段
		for (Field f : fields) {
			String name = f.getName();
			Object objVal = params.get(name);
			// 找到对应值,进行转化设置
			if (objVal != null) {
				try {
					if (f.getType().equals(String.class)) {
						objVal = String.valueOf(objVal);
					} else if (!f.getType().isAssignableFrom(objVal.getClass())) {
						if (isNotBlank(String.valueOf(objVal))) {
							//转换依赖方法:org.apache.commons.beanutils.ConvertUtils.convert(Object, Class<?>)
							objVal = ConvertUtils.convert(objVal, f.getType());
						} else {
							objVal = null;
						}
					}
					f.set(entity, objVal);
				} catch (Exception e) {
					throw new RuntimeException(e);
				}
			}
		}
		return entity;
	}

	/**
	 * 循环向上转型, 获取对象所有的DeclaredField
	 * 
	 * 如向上转型到Object仍无法找到, 返回null.
	 */
	public static List<Field> getAccessibleFields(final Class<?> clazz) {
		List<Field> fields = new ArrayList<>();
		for (Class<?> superClass = clazz; superClass != Object.class; superClass = superClass.getSuperclass()) {
			for (Field f : superClass.getDeclaredFields()) {
				boolean hasInSubClass = false;
				for (Field f2 : fields) {
					if (f2.getName().equals(f.getName())) {
						hasInSubClass = true;
						break;
					}
				}
				if (!hasInSubClass) {
					makeAccessible(f);
					fields.add(f);
				}
			}
		}
		return fields;
	}

	/**
	 * 改变private/protected的成员变量为public,尽量不调用实际改动的语句,避免JDK的SecurityManager抱怨。
	 */
	public static void makeAccessible(Field field) {
		if ((!Modifier.isPublic(field.getModifiers()) || !Modifier.isPublic(field.getDeclaringClass().getModifiers())
				|| Modifier.isFinal(field.getModifiers())) && !field.isAccessible()) {
			field.setAccessible(true);
		}
	}
使用方法,直接调用:mapToObjModle方法即可

猜你喜欢

转载自blog.csdn.net/qq_23490959/article/details/79126244