java reflection tool class (call for api interface)

 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

 

Guess you like

Origin blog.csdn.net/qq_38428623/article/details/89405275