You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
chat-room/util/BeanUtils.java

155 lines
5.6 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

/*
* Copyright (c) 2019. 黄钰朝
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.hyc.wechat.util;
import com.alibaba.fastjson.JSONObject;
import com.hyc.wechat.dao.impl.SQLRunnerImpl;
import com.hyc.wechat.model.po.User;
import org.apache.log4j.Logger;
import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.nio.charset.StandardCharsets;
import java.util.LinkedList;
import java.util.Map;
import static com.hyc.wechat.util.ReflectUtils.getFields;
import static com.hyc.wechat.util.ReflectUtils.getMethods;
import static com.hyc.wechat.util.StringUtils.toLegalText;
/**
* @author <a href="mailto:kobe524348@gmail.com">黄钰朝</a>
* @description 用于将请求参数映射为Javabean对象
* @date 2019-04-15 00:47
*/
public class BeanUtils {
/**
* 负责将request中的parameterMap映射成为一个对象
*
* @param map request中的getParameterMap返回的Map
* @param clazz 映射的目标类,将返回该类的一个实例
* @return java.lang.Object
* @name toObject
* @notice none
* @author <a href="mailto:kobe524348@gmail.com">黄钰朝</a>
* @date 2019/4/15
*/
public static Object toObject(Map<String, String[]> map, Class clazz) {
/**
* 本方法仅用来将request中的参数映射为对象并不承担<br>
* 数据检查的职责,因此本方法中产生的异常没有打印堆栈信息
*/
LinkedList<Method> methods = null;
LinkedList<Field> fields = null;
Object obj;
try {
obj = clazz.newInstance();
methods = getMethods(obj);
fields = getFields(obj);
} catch (InstantiationException | IllegalAccessException e) {
e.printStackTrace();
throw new RuntimeException("无法实例化类:" + clazz.getName());
}
for (Field f : fields) {
/**
* 获取每个属性的String类型参数的构造器
*/
Constructor cons = null;
try {
cons = f.getType().getConstructor(String.class);
} catch (Exception e) {
/**
* 某些属性确实没有这种构造器,在这里不需要处理这个问题
*/
Logger logger = Logger.getLogger(BeanUtils.class);
logger.debug("从请求参数转化成对象时缺少String类型的构造器 " +f.getName() );
}
/**
* 构造属性
*/
String[] param = map.get(f.getName());
if (param != null && param[0] != null) {
Object value = null;
try {
if (cons != null) {
/**
* 编码格式转换
*/
param[0] = new String(param[0].getBytes(), StandardCharsets.UTF_8);
/**
* 过滤非法字符
*/
param[0] = toLegalText(param[0]);
value = cons.newInstance(param[0]);
}
for (Method m : methods) {
if (m.getName().equalsIgnoreCase(StringUtils.field2SetMethod(f.getName()))) {
m.invoke(obj, value);
}
}
} catch (InstantiationException | IllegalAccessException | InvocationTargetException e) {
/**
* 某些属性可能由于非法输入而无法初始化,这里无需处理
*/
Logger logger = Logger.getLogger(BeanUtils.class);
logger.debug("从请求参数转化成对象时无法初始化[属性] " +f.getName()+ " [属性值]" + param[0] );
}
}
}
return obj;
}
public static Object jsonToJavaObject(InputStream inputStream,Class targetClass) {
/**
* 将输入流中的json数据转化成java对象
* @name jsonToJavaObject
* @param inputStream 输入json数据的输入流
* @notice none
* @author <a href="mailto:kobe524348@gmail.com">黄钰朝</a>
* @date 2019/5/5
*/ JSONObject jsonObject = null;
try {
BufferedReader streamReader = new BufferedReader(new InputStreamReader(inputStream, "UTF-8"));
StringBuilder builder = new StringBuilder();
String jsonData;
while ((jsonData = streamReader.readLine()) != null) {
builder.append(jsonData);
}
jsonObject = JSONObject.parseObject(builder.toString());
Logger logger = Logger.getLogger(BeanUtils.class);
logger.info("从请求中获得json数据"+jsonObject.toJSONString());
} catch (Exception e) {
e.printStackTrace();
}
return JSONObject.toJavaObject(jsonObject, targetClass);
}
}