天天看点

利用反射进行操作的一个工具类

工作中用到的关于反射的一些处理,进行总结

import java.lang.reflect.Field;

	/**
	 * 利用反射进行操作的一个工具类
	 *
	 */
	public class ReflectUtil {
		/**
		 * 利用反射获取指定对象的指定属性
		 * 
		 * @param obj       目标对象
		 * @param fieldName 目标属性
		 * @return 目标属性的值
		 */
		public static Object getFieldValue(Object obj, String fieldName) {
			Object result = null;
			Field field = ReflectUtil.getField(obj, fieldName);
			if (field != null) {
				field.setAccessible(true);
				try {
					result = field.get(obj);
				} catch (IllegalArgumentException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				} catch (IllegalAccessException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
			return result;
		}

		/**
		 * 利用反射获取指定对象里面的指定属性
		 * 
		 * @param obj       目标对象
		 * @param fieldName 目标属性
		 * @return 目标字段
		 */
		private static Field getField(Object obj, String fieldName) {
			Field field = null;
			for (Class<?> clazz = obj.getClass(); clazz != Object.class; clazz = clazz.getSuperclass()) {
				try {
					field = clazz.getDeclaredField(fieldName);
					break;
				} catch (NoSuchFieldException e) {
					// 这里不用做处理,子类没有该字段可能对应的父类有,都没有就返回null。
				}
			}
			return field;
		}

		/**
		 * 利用反射设置指定对象的指定属性为指定的值
		 * 
		 * @param obj        目标对象
		 * @param fieldName  目标属性
		 * @param fieldValue 目标值
		 */
		public static void setFieldValue(Object obj, String fieldName, String fieldValue) {
			Field field = ReflectUtil.getField(obj, fieldName);
			if (field != null) {
				try {
					field.setAccessible(true);
					field.set(obj, fieldValue);
				} catch (IllegalArgumentException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				} catch (IllegalAccessException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
		}

		public static String getString(Object obj) throws Exception {
			StringBuffer sb = new StringBuffer("");
			String lineSeparator = System.getProperty("line.separator", "\n");
			Field[] fields = obj.getClass().getDeclaredFields();
			for (Field f : fields) {
				f.setAccessible(true);
			}

			for (Field f : fields) {
				String field = f.toString().substring(f.toString().lastIndexOf(".") + 1); // 取出属性名称
				sb.append(lineSeparator).append(field).append(" --> ").append(f.get(obj)).append("");

			}
			return sb.toString();
		}
	}