Tool class for Api interface reflection objects:
Converted to the format submitted by form name=value and the format submitted by get parameter name=value&key=value, it supports filtering the specified attributes, the specific reference is as follows:
import com.alibaba.fastjson.JSON;
import lombok.Data;
import org.apache.http.NameValuePair;
import org.apache.http.client.utils.URLEncodedUtils;
import org.apache.http.message.BasicNameValuePair;
import org.springframework.util.Assert;
import org.springframework.util.CollectionUtils;
import org.springframework.util.StringUtils;
import java.io.Serializable;
import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;
import java.util.stream.Collectors;
/**
* @PRODUCT_NAME: IntelliJ IDEA
* @PROJECT_NAME: ztracecore
* @PACKAGE_NAME: com.zto.ztrace.service.ztrace
* @AUTHOR: Choj
* @DATE: 2019-04-19 11:15
* @NAME: ReflectUtil
* @DESRIPTION: 反射工具
**/
public class ReflectUtil {
/**
* 编码方式 UTF-8
*/
private static final String UTF8 = "UTF-8";
/**
* 获取字符串
*
* @param obj 对象
* @param <T> 泛型
* @return 返回拼接好的字符串
* @throws IllegalAccessException 访问异常
*/
public static <T> String objToUrlParam(final T obj) throws IllegalAccessException {
return ReflectUtil.objToUrlParam(obj, ReflectUtil.UTF8);
}
/**
* 获取字符串
*
* @param obj 对象
* @param charset 编码方式
* @param <T> 泛型
* @return 返回拼接好的字符串
* @throws IllegalAccessException 访问异常
*/
public static <T> String objToUrlParam(final T obj, final String charset) throws IllegalAccessException {
return ReflectUtil.objToUrlParam(obj, charset, null);
}
/**
* 获取字符串
*
* @param obj 对象
* @param charset 编码方式
* @param comparator 排序方式
* @param <T> 泛型
* @return 返回拼接好的字符串
* @throws IllegalAccessException 访问异常
*/
public static <T> String objToUrlParam(final T obj, final String charset, final Comparator<? super NameValuePair> comparator) throws IllegalAccessException {
return ReflectUtil.objToUrlParam(obj, charset, comparator, null);
}
/**
* 获取字符串
*
* @param obj 对象
* @param charset 编码方式
* @param comparator 排序方式
* @param ignoreFieldNames 忽略的属性名称集合
* @param <T> 泛型
* @return 返回拼接好的字符串
* @throws IllegalAccessException 访问异常
*/
public static <T> String objToUrlParam(final T obj, String charset, final Comparator<? super NameValuePair> comparator, final List<String> ignoreFieldNames) throws IllegalAccessException {
if (StringUtils.isEmpty(charset)) {
charset = ReflectUtil.UTF8;
}
List<NameValuePair> nameValuePairs = ReflectUtil.objToList(obj, ignoreFieldNames);
if (comparator != null) {
nameValuePairs = nameValuePairs.stream().sorted(comparator).collect(Collectors.toList());
}
return URLEncodedUtils.format(nameValuePairs, charset);
}
/**
* 对象转List
*
* @param obj 对象
* @param <T> 泛型对象
* @return 返回转换之后的对象
* @throws IllegalAccessException 访问异常
*/
public static <T> List<NameValuePair> objToList(final T obj) throws IllegalAccessException {
return ReflectUtil.objToList(obj, null);
}
/**
* 对象转List
*
* @param obj 对象
* @param ignoreFieldNames 忽略的字段名称
* @param <T> 泛型对象
* @return 返回转换之后的对象
* @throws IllegalAccessException 访问异常
*/
public static <T> List<NameValuePair> objToList(final T obj, final List<String> ignoreFieldNames) throws IllegalAccessException {
Assert.state(!StringUtils.isEmpty(obj), "obj 不能为空");
Assert.state(!(obj instanceof Class), "obj 必须是class的实例");
final List<NameValuePair> nameValuePairs = new ArrayList<>();
final Field[] fields = obj.getClass().getDeclaredFields();
for (final Field field : fields) {
if (!CollectionUtils.isEmpty(ignoreFieldNames) && ignoreFieldNames.contains(field.getName())) {
continue;
}
final boolean accessible = field.isAccessible();
if (!accessible) {
field.setAccessible(true);
}
String value = null;
final Object o = field.get(obj);
if (o != null) {
value = String.valueOf(o);
}
nameValuePairs.add(new BasicNameValuePair(field.getName(), value));
field.setAccessible(accessible);
}
return nameValuePairs;
}
// ------- 测试代码 --------
/**
* 测试类
*/
@Data
public static class Test implements Serializable {
/**
* serialVersionUID
*/
private static final long serialVersionUID = 3439440514346215958L;
/**
* 名称
*/
private String name;
/**
* 值
*/
private String value;
}
/**
* 入口
*
* @param args 参数
*/
public static void main(final String[] args) throws IllegalAccessException {
final Test test = new ReflectUtil.Test();
test.setName("名称");
test.setValue("对应的值");
System.out.println(JSON.toJSONString(ReflectUtil.objToList(test)));
System.out.println(ReflectUtil.objToUrlParam(test));
final List<String> list = new ArrayList<>();
list.add("serialVersionUID");
System.out.println(ReflectUtil.objToUrlParam(test, null, null, list));
final String objToUrlParamSort = ReflectUtil.objToUrlParam(test, null, Comparator.comparing(NameValuePair::getName));
System.out.println(objToUrlParamSort);
}
}
Request result:
[{"name":"serialVersionUID","value":"3439440514346215958"},{"name":"name","value":"名称"},{"name":"value","value":"对应的值"}]
serialVersionUID=3439440514346215958&name=%E5%90%8D%E7%A7%B0&value=%E5%AF%B9%E5%BA%94%E7%9A%84%E5%80%BC
name=%E5%90%8D%E7%A7%B0&value=%E5%AF%B9%E5%BA%94%E7%9A%84%E5%80%BC
name=%E5%90%8D%E7%A7%B0&serialVersionUID=3439440514346215958&value=%E5%AF%B9%E5%BA%94%E7%9A%84%E5%80%BC