国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發(fā)設計 > 正文

反射工具類

2019-11-08 01:58:29
字體:
來源:轉載
供稿:網友
import java.lang.reflect.Field;import java.lang.reflect.InvocationTargetException;import java.lang.reflect.Method;import java.lang.reflect.Modifier;import java.lang.reflect.ParameterizedType;import java.lang.reflect.Type;import java.util.ArrayList;import java.util.Collection;import java.util.Date;import java.util.List;import org.apache.commons.beanutils.BeanUtils;import org.apache.commons.beanutils.ConvertUtils;import org.apache.commons.beanutils.PRopertyUtils;import org.apache.commons.beanutils.locale.converters.DateLocaleConverter;import org.apache.commons.lang3.StringUtils;import org.apache.commons.logging.Log;import org.apache.commons.logging.LogFactory;import org.springframework.util.Assert;/** * 反射工具類. * * 提供訪問私有變量,獲取泛型類型Class, 提取集合中元素的屬性, 轉換字符串到對象等Util函數. */@SuppressWarnings("rawtypes")public class ReflectionUtils { private static Log logger = LogFactory.getLog(ReflectionUtils.class); static { DateLocaleConverter dc = new DateLocaleConverter(); ConvertUtils.register(dc, Date.class); } /** * 調用Getter方法. */ public static Object invokeGetterMethod(Object target, String propertyName) { String getterMethodName = "get" + StringUtils.capitalize(propertyName); return invokeMethod(target, getterMethodName, new Class[] {}, new Object[] {}); } /** * 調用Setter方法.使用value的Class來查找Setter方法. */ public static void invokeSetterMethod(Object target, String propertyName, Object value) { invokeSetterMethod(target, propertyName, value, null); } /** * 調用Setter方法. * * @param propertyType * 用于查找Setter方法,為空時使用value的Class替代. */ public static void invokeSetterMethod(Object target, String propertyName, Object value, Class<?> propertyType) { Class<?> type = propertyType != null ? propertyType : value.getClass(); String setterMethodName = "set" + StringUtils.capitalize(propertyName); invokeMethod(target, setterMethodName, new Class[] { type }, new Object[] { value }); } /** * 直接讀取對象屬性值, 無視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 = field.get(object); } catch (IllegalAccessException e) { logger.error("不可能拋出的異常{}" + e.getMessage()); } 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 { field.set(object, value); } catch (IllegalAccessException e) { logger.error("不可能拋出的異常:{}" + e.getMessage()); } } /** * 直接調用對象方法, 無視private/protected修飾符. */ public static Object invokeMethod(final Object object, final String methodName, final Class<?>[] parameterTypes, final Object[] parameters) { 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); try { return method.invoke(object, parameters); } catch (Exception e) { throw convertReflectionExceptionToUnchecked(e); } } /** * 循環(huán)向上轉型, 獲取對象的DeclaredField. * * 如向上轉型到Object仍無法找到, 返回null. */ protected static Field getDeclaredField(final Object object, final String fieldName) { Assert.notNull(object, "object不能為空"); Assert.hasText(fieldName, "fieldName"); for (Class<?> superClass = object.getClass(); superClass != Object.class; superClass = superClass .getSuperclass()) { try { return superClass.getDeclaredField(fieldName); } catch (NoSuchFieldException e) { // NOSONAR // Field不在當前類定義,繼續(xù)向上轉型 } } return null; } /** * 強行設置Field可訪問. */ protected static void makeAccessible(final Field field) { if (!Modifier.isPublic(field.getModifiers()) || !Modifier.isPublic(field.getDeclaringClass().getModifiers())) { field.setAccessible(true); } } /** * 循環(huán)向上轉型, 獲取對象的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不在當前類定義,繼續(xù)向上轉型 } } return null; } /** * 通過反射, 獲得Class定義中聲明的父類的泛型參數的類型. 如無法找到, 返回Object.class. eg. public UserDao * extends HibernateDao<User> */ @SuppressWarnings("unchecked") public static <T> Class<T> getSuperClassGenricType(final Class clazz) { return getSuperClassGenricType(clazz, 0); } /** * 通過反射, 獲得定義Class時聲明的父類的泛型參數的類型. 如無法找到, 返回Object.class. * * 如public UserDao extends HibernateDao<User,Long> */ public static Class getSuperClassGenricType(final Class clazz, final int index) { Type genType = clazz.getGenericSuperclass(); if (!(genType instanceof ParameterizedType)) { logger.warn(clazz.getSimpleName() + "'s superclass not ParameterizedType"); return Object.class; } Type[] params = ((ParameterizedType) genType).getActualTypeArguments(); if (index >= params.length || index < 0) { logger.warn("Index: " + index + ", Size of " + clazz.getSimpleName() + "'s Parameterized Type: " + params.length); return Object.class; } if (!(params[index] instanceof Class)) { logger.warn(clazz.getSimpleName() + " not set the actual class on superclass generic parameter"); return Object.class; } return (Class) params[index]; } /** * 提取集合中的對象的屬性(通過getter函數), 組合成List. * * @param collection 來源集合. * @param propertyName 要提取的屬性名. */ @SuppressWarnings("unchecked") public static List convertElementPropertyToList(final Collection collection, final String propertyName) { List list = new ArrayList(); try { for (Object obj : collection) { list.add(PropertyUtils.getProperty(obj, propertyName)); } } catch (Exception e) { throw convertReflectionExceptionToUnchecked(e); } return list; } /** * 提取集合中的對象的屬性(通過getter函數), 組合成由分割符分隔的字符串. * * @param collection 來源集合. * @param propertyName 要提取的屬性名. * @param separator 分隔符. */ public static String convertElementPropertyToString(final Collection collection, final String propertyName, final String separator) { List list = convertElementPropertyToList(collection, propertyName); return StringUtils.join(list, separator); } /** * 轉換字符串到相應類型. * * @param value 待轉換的字符串 * @param toType 轉換目標類型 */ @SuppressWarnings("unchecked") public static <T> T convertStringToObject(String value, Class<T> toType) { try { return (T) ConvertUtils.convert(value, toType); } catch (Exception e) { throw convertReflectionExceptionToUnchecked(e); } } /** * 將反射時的checked exception轉換為unchecked exception. */ public static RuntimeException convertReflectionExceptionToUnchecked(Exception e) { return convertReflectionExceptionToUnchecked(null, e); } public static RuntimeException convertReflectionExceptionToUnchecked(String desc, Exception e) { desc = (desc == null) ? "Unexpected Checked Exception." : desc; if (e instanceof IllegalAccessException || e instanceof IllegalArgumentException || e instanceof NoSuchMethodException) { return new IllegalArgumentException(desc, e); } else if (e instanceof InvocationTargetException) { return new RuntimeException(desc, ((InvocationTargetException) e).getTargetException()); } else if (e instanceof RuntimeException) { return (RuntimeException) e; } return new RuntimeException(desc, e); } public static final <T> T getNewInstance(Class<T> cls) { try { return cls.newInstance(); } catch (InstantiationException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } return null; } /** * 拷貝 source 指定的porperties 屬性 到 dest中 */ public static void copyPorperties(Object dest, Object source, String[] porperties) throws InvocationTargetException, IllegalAccessException { for (String por : porperties) { Object srcObj = invokeGetterMethod(source, por); logger.debug("屬性名:" + por + "------------- 屬性值:" + srcObj); if (srcObj != null) { try { BeanUtils.setProperty(dest, por, srcObj); } catch (IllegalArgumentException e) { e.printStackTrace(); } catch (IllegalAccessException e) { throw e; } catch (InvocationTargetException e) { throw e; } } } } /** * 兩者屬性名一致時,拷貝source里的屬性到dest里 */ public static void copyPorperties(Object dest, Object source) throws IllegalAccessException, 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 (IllegalArgumentException e) { e.printStackTrace(); } catch (IllegalAccessException e) { throw e; } catch (InvocationTargetException e) { throw e; } } // BeanUtils.copyProperties(dest, orig); }}
發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 晋江市| 胶州市| 祁门县| 安阳市| 惠东县| 龙井市| 西昌市| 涪陵区| 新邵县| 罗江县| 沿河| 富锦市| 淅川县| 贵德县| 五常市| 洛隆县| 浪卡子县| 武山县| 勐海县| 胶南市| 汽车| 鹤峰县| 晋州市| 齐河县| 离岛区| 淳安县| 荔浦县| 贵德县| 康乐县| 巴中市| 泌阳县| 岐山县| 修水县| 华安县| 汽车| 台前县| 镇雄县| 张家港市| 济南市| 德昌县| 沁阳市|