反射的Utils函数集合
提供访问私有变量获取泛型类型Class提取集合中元素的属性等Utils函数
package reflection
import javalangreflectField import javalangreflectModifier import javalangreflectParameterizedType import javalangreflectType import javautilArrayList import javautilCollection import javautilList
import monsbeanutilsPropertyUtils import monslangStringUtils import orgslfjLogger import orgslfjLoggerFactory import orgspringframeworkutilAssert
/** * 反射的Utils函数集合 提供访问私有变量获取泛型类型Class提取集合中元素的属性等Utils函数
* * @author lei */ public class ReflectionUtils {
private static Logger logger = LoggerFactorygetLogger(ReflectionUtilsclass)
private ReflectionUtils() { }
/** * 直接读取对象属性值无视private/protected修饰符不经过getter函数
*/ public static Object getFieldValue(final Object object final String fieldName) { Field field = getDeclaredField(object fieldName)
if (field == null)
throw new IllegalArgumentException(Could not find field [ + fieldName + ] on target [ + object + ])
makeAccessible(field)
Object result = null try { result = fieldget(object) } catch (IllegalAccessException e) { loggererror(不可能抛出的异常{} egetMessage()) } return result }
/** * 直接设置对象属性值无视private/protected修饰符不经过setter函数
*/ public static void setFieldValue(final Object object final String fieldName final Object value) { Field field = getDeclaredField(object fieldName)
if (field == null)
throw new IllegalArgumentException(Could not find field [ + fieldName + ] on target [ + object + ])
makeAccessible(field)
try { fieldset(object value) } catch (IllegalAccessException e) { loggererror(不可能抛出的异常{} egetMessage()) } }
/** * 循环向上转型获取对象的DeclaredField */ protected static Field getDeclaredField(final Object object final String fieldName) { AssertnotNull(object object不能为空) return getDeclaredField(objectgetClass() fieldName) }
/** * 循环向上转型获取类的DeclaredField */ @SuppressWarnings(unchecked)
protected static Field getDeclaredField(final Class clazz final String fieldName) { AssertnotNull(clazz clazz不能为空) AsserthasText(fieldName fieldName) for (Class superClass = clazz superClass != Objectclass superClass = superClassgetSuperclass()) { try { return superClassgetDeclaredField(fieldName) } catch (NoSuchFieldException e) { // Field不在当前类定义继续向上转型 } } return null }
/** * 强制转换fileld可访问
*/ protected static void makeAccessible(final Field field) { if (!ModifierisPublic(fieldgetModifiers()) || !ModifierisPublic(fieldgetDeclaringClass()getModifiers())) { fieldsetAccessible(true) } }
/** * 通过反射获得定义Class时声明的父类的泛型参数的类型 如public UserDao extends HibernateDao<User> * * @param clazz * The class to introspect * @return the first generic declaration or Objectclass if cannot be * determined */ @SuppressWarnings(unchecked)
public static Class getSuperClassGenricType(final Class clazz) { return getSuperClassGenricType(clazz ) }
/** * 通过反射获得定义Class时声明的父类的泛型参数的类型 如public UserDao extends * HibernateDao<UserLong> * * @param clazz * clazz The class to introspect * @param index * the Index of the generic ddeclarationstart from * @return the index generic declaration or Objectclass if cannot be * determined */
@SuppressWarnings(unchecked)
public static Class getSuperClassGenricType(final Class clazz final int index) {
Type genType = clazzgetGenericSuperclass()
if (!(genType instanceof ParameterizedType)) { loggerwarn(clazzgetSimpleName() + s superclass not ParameterizedType) return Objectclass }
Type[] params = ((ParameterizedType) genType)getActualTypeArguments()
if (index >= paramslength || index < ) { loggerwarn(Index + index + Size of + clazzgetSimpleName() + s Parameterized Type + paramslength) return Objectclass } if (!(params[index] instanceof Class)) { loggerwarn(clazzgetSimpleName() + not set the actual class on superclass generic parameter) return Objectclass } return (Class) params[index] }
/** * 提取集合中的对象的属性组合成List * * @param collection * 来源集合
* @param propertityName * 要提取的属性名
*/ @SuppressWarnings(unchecked)
public static List fetchElementPropertyToList(final Collection collection final String propertyName) throws Exception {
List list = new ArrayList()
for (Object obj collection) { listadd(PropertyUtilsgetProperty(obj propertyName)) }
return list }
/** * 提取集合中的对象的属性组合成由分割符分隔的字符串
* * @param collection * 来源集合
* @param propertityName * 要提取的属性名
* @param separator * 分隔符
*/ @SuppressWarnings(unchecked)
public static String fetchElementPropertyToString(final Collection collection final String propertyName final String separator) throws Exception { List list = fetchElementPropertyToList(collection propertyName) return StringUtilsjoin(listtoArray() separator) } }