175 lines
5.1 KiB
Plaintext
175 lines
5.1 KiB
Plaintext
package com.bonus.core;
|
||
|
||
import java.lang.reflect.Field;
|
||
import java.lang.reflect.InvocationTargetException;
|
||
import java.lang.reflect.Method;
|
||
|
||
import org.apache.commons.beanutils.BeanUtils;
|
||
import org.apache.commons.lang3.StringUtils;
|
||
import org.springframework.util.Assert;
|
||
|
||
|
||
/**
|
||
* 利用反射进行操作的一个工具类
|
||
*/
|
||
public class ReflectHelper {
|
||
/**
|
||
* 利用反射获取指定对象的指定属性
|
||
*
|
||
* @param obj
|
||
* 目标对象
|
||
* @param fieldName
|
||
* 目标属性
|
||
* @return 目标属性的值
|
||
*/
|
||
public static Object getFieldValue(Object obj, String fieldName) {
|
||
Object result = null;
|
||
Field field = ReflectHelper.getField(obj, fieldName);
|
||
if (field != null) {
|
||
field.setAccessible(true);
|
||
try {
|
||
result = field.get(obj);
|
||
} catch (IllegalArgumentException e) {
|
||
e.printStackTrace();
|
||
} catch (IllegalAccessException e) {
|
||
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 = ReflectHelper.getField(obj, fieldName);
|
||
if (field != null) {
|
||
try {
|
||
field.setAccessible(true);
|
||
field.set(obj, fieldValue);
|
||
} catch (IllegalArgumentException e) {
|
||
e.printStackTrace();
|
||
} catch (IllegalAccessException e) {
|
||
e.printStackTrace();
|
||
}
|
||
}
|
||
}
|
||
|
||
/**
|
||
* 两者属性名一致时,拷贝source里的属性到dest里
|
||
*
|
||
* @return void
|
||
* @throws IllegalArgumentException
|
||
* @throws IllegalAccessException
|
||
* @throws InvocationTargetException
|
||
*/
|
||
public static void copyPorperties(Object dest, Object source) throws IllegalAccessException, IllegalArgumentException, InvocationTargetException{
|
||
Class<?> srcCla = source.getClass();
|
||
Field[] fsF = srcCla.getDeclaredFields();
|
||
|
||
for (Field s : fsF)
|
||
{
|
||
String name = s.getName();
|
||
Object srcObj = invokeGetterMethod(source, name);
|
||
try
|
||
{
|
||
BeanUtils.setProperty(dest, name, srcObj);
|
||
}
|
||
catch (Exception e){
|
||
e.printStackTrace();
|
||
}
|
||
|
||
}
|
||
}
|
||
|
||
/**
|
||
* 调用Getter方法.
|
||
* @throws InvocationTargetException
|
||
* @throws IllegalArgumentException
|
||
* @throws IllegalAccessException
|
||
*/
|
||
public static Object invokeGetterMethod(Object target, String propertyName) throws IllegalAccessException, IllegalArgumentException, InvocationTargetException
|
||
{
|
||
String getterMethodName = "get" + StringUtils.capitalize(propertyName);
|
||
return invokeMethod(target, getterMethodName, new Class[] {},
|
||
new Object[] {});
|
||
}
|
||
|
||
/**
|
||
* 直接调用对象方法, 无视private/protected修饰符.
|
||
* @throws InvocationTargetException
|
||
* @throws IllegalArgumentException
|
||
* @throws IllegalAccessException
|
||
*/
|
||
public static Object invokeMethod(final Object object,
|
||
final String methodName, final Class<?>[] parameterTypes,
|
||
final Object[] parameters) throws IllegalAccessException, IllegalArgumentException, InvocationTargetException{
|
||
Method method = getDeclaredMethod(object, methodName, parameterTypes);
|
||
if (method == null)
|
||
{
|
||
throw new IllegalArgumentException("Could not find method ["
|
||
+ methodName + "] parameterType " + parameterTypes
|
||
+ " on target [" + object + "]");
|
||
}
|
||
|
||
method.setAccessible(true);
|
||
return method.invoke(object, parameters);
|
||
}
|
||
|
||
/**
|
||
* 循环向上转型, 获取对象的DeclaredMethod.
|
||
*
|
||
* 如向上转型到Object仍无法找到, 返回null.
|
||
*/
|
||
protected static Method getDeclaredMethod(Object object, String methodName,
|
||
Class<?>[] parameterTypes)
|
||
{
|
||
Assert.notNull(object, "object不能为空");
|
||
|
||
for (Class<?> superClass = object.getClass(); superClass != Object.class; superClass = superClass
|
||
.getSuperclass())
|
||
{
|
||
try{
|
||
return superClass.getDeclaredMethod(methodName, parameterTypes);
|
||
}
|
||
catch (NoSuchMethodException e)
|
||
{// NOSONAR
|
||
// Method不在当前类定义,继续向上转型
|
||
}
|
||
}
|
||
return null;
|
||
}
|
||
}
|
||
|