package com.xkj.spider.mpb.util; import java.lang.reflect.Method; import java.util.HashMap; import java.util.Map; import java.util.TreeMap; import lombok.extern.slf4j.Slf4j; /** * 對屬性進行排序得一個排序後的屬性字符串 * @author yangzl * @data 2019年4月4日 * */ @Slf4j public class SortPropertiesUtils { public static final String PARAM_EQUAL = "="; public static final String PARAM_AND = "&"; private SortPropertiesUtils() {} /** * 對Object進行List<NameValuePair>轉換後按key進行升序排序,以key=value&...形式返回 * * @param list * @return */ public static String sort(Object order) { Map<String, Object> map = bean2Parameters(order); return sort(map); } /** * 對對Object轉換後, 以key=value&...形式返回按key進行升序排序,以key=value&...形式返回 * * @param order * @return */ public static String sort(Map<String, Object> order) { if (null == order || order.isEmpty()) { return null; } Map<String, Object> parameters = new TreeMap<>((obj1, obj2) -> obj1.compareToIgnoreCase(obj2)); parameters.putAll(order); StringBuilder sb = new StringBuilder(); for (Map.Entry<String, Object> entry : parameters.entrySet()) { if (null != entry.getValue()) { sb.append(entry.getKey()); sb.append(PARAM_EQUAL); sb.append(entry.getValue().toString()); sb.append(PARAM_AND); } } String params = sb.toString(); if (sb.toString().endsWith(PARAM_AND)) { params = sb.substring(0, sb.length() - 1); } return params; } /** * 將bean轉換成鍵值對列表 * * @param bean * @return */ private static Map<String, Object> bean2Parameters(Object bean) { if (bean == null) { return null; } Map<String, Object> parameters = new HashMap<>(); if (null != parameters) { // 取得bean全部public 方法 Method[] Methods = bean.getClass().getMethods(); for (Method method : Methods) { if (method != null && method.getName().startsWith("get") && !method.getName().startsWith("getClass")) { // 獲得屬性的類名 Object value = null; // 獲得屬性值 try { value = method.invoke(bean); if (null != value) { // 添加參數 // 將方法名稱轉化爲id,去除get,將方法首字母改成小寫 String param = method.getName().replaceFirst("get", ""); if (param.length() > 0) { String first = String.valueOf(param.charAt(0)).toLowerCase(); param = first + param.substring(1); } parameters.put(param, value); } } catch (Exception e) { log.error("", e.getMessage(), e); } } } } return parameters; } }
在大部分有md5簽名驗證,或者一些加密算法的驗證中都須要對數據進行排序。java