Java反射工具类介绍

[摘要]反射的Utils函数集合。提供访问私有变量,获取泛型类型Class,提取集合中元素的属性等Utils函数。

(中国软件网讯)反射的Utils函数集合。提供访问私有变量,获取泛型类型Class,提取集合中元素的属性等Utils函数。

package reflection;002

003 import java.lang.reflect.Field;004 import java.lang.reflect.Modifier;005 import java.lang.reflect.ParameterizedType;006 import java.lang.reflect.Type;007 import java.util.ArrayList;008 import java.util.Collection;009 import java.util.List;010

011 import org.apache.commons.beanutils.PropertyUtils;012 import org.apache.commons.lang.StringUtils;013 import org.slf4j.Logger;014 import org.slf4j.LoggerFactory;015 import org.springframework.util.Assert;016

017 /** 018 * 反射的Utils函数集合。 提供访问私有变量,获取泛型类型Class,提取集合中元素的属性等Utils函数。

019 * 020 * @author lei 021 */ 022 public class ReflectionUtils { 023

024 private static Logger logger = LoggerFactory.getLogger(ReflectionUtils.class);025

026 private ReflectionUtils() { 027 } 028

029 /** 030 * 直接读取对象属性值,无视private/protected修饰符,不经过getter函数。

031 */ 032 public static Object getFieldValue(final Object object, final String fieldName) { 033 Field field = getDeclaredField(object, fieldName);034

035 if (field == null)

036 throw new IllegalArgumentException("Could not find field [" + fieldName + "] on target [" + object + "]");037

038 makeAccessible(field);039

040 Object result = null;041 try { 042 result = field.get(object);043 } catch (IllegalAccessException e) { 044 logger.error("不可能抛出的异常{}", e.getMessage());045 } 046 return result;047 } 048

049 /** 050 * 直接设置对象属性值,无视private/protected修饰符,不经过setter函数。

051 */ 052 public static void setFieldValue(final Object object, final String fieldName, final Object value) { 053 Field field = getDeclaredField(object, fieldName);054

055 if (field == null)

056 throw new IllegalArgumentException("Could not find field [" + fieldName + "] on target [" + object + "]");057

058 makeAccessible(field);059

060 try { 061 field.set(object, value);062 } catch (IllegalAccessException e) { 063 logger.error("不可能抛出的异常:{}", e.getMessage());064 } 065 } 066

067 /** 068 * 循环向上转型,获取对象的DeclaredField. 069 */ 070 protected static Field getDeclaredField(final Object object, final String fieldName) { 071 Assert.notNull(object, "object不能为空");072 return getDeclaredField(object.getClass(), fieldName);073 } 074

075 /** 076 * 循环向上转型,获取类的DeclaredField. 077 */ 078 @SuppressWarnings("unchecked")

079 protected static Field getDeclaredField(final Class clazz, final String fieldName) { 080 Assert.notNull(clazz, "clazz不能为空");081 Assert.hasText(fieldName, "fieldName");082 for (Class superClass = clazz; superClass != Object.class; superClass = superClass.getSuperclass()) { 083 try { 084 return superClass.getDeclaredField(fieldName);085 } catch (NoSuchFieldException e) { 086 // Field不在当前类定义,继续向上转型087 } 088 } 089 return null;090 } 091

092 /** 093 * 强制转换fileld可访问。

094 */ 095 protected static void makeAccessible(final Field field) { 096 if (!Modifier.isPublic(field.getModifiers()) || !Modifier.isPublic(field.getDeclaringClass()。getModifiers())) { 097 field.setAccessible(true);098 } 099 } 100

101 /** 102 * 通过反射,获得定义Class时声明的父类的泛型参数的类型。 如public UserDao extends HibernateDao 103 * 104 * @param clazz 105 * The class to introspect 106 * @return the first generic declaration, or Object.class if cannot be 107 * determined 108 */ 109 @SuppressWarnings("unchecked")

110 public static Class getSuperClassGenricType(final Class clazz) { 111 return getSuperClassGenricType(clazz, 0);112 } 113

114 /** 115 * 通过反射,获得定义Class时声明的父类的泛型参数的类型。 如public UserDao extends 116 * HibernateDao 117 * 118 * @param clazz 119 * clazz The class to introspect 120 * @param index 121 * the Index of the generic ddeclaration,start from 0. 122 * @return the index generic declaration, or Object.class if cannot be 123 * determined 124 */ 125

126 @SuppressWarnings("unchecked")

127 public static Class getSuperClassGenricType(final Class clazz, final int index) { 128

129 Type genType = clazz.getGenericSuperclass();130

131 if (!(genType instanceof ParameterizedType)) { 132 logger.warn(clazz.getSimpleName() + "'s superclass not ParameterizedType");133 return Object.class;134 } 135

136 Type[] params = ((ParameterizedType) genType)。getActualTypeArguments();137

138 if (index >= params.length || index < 0) { 139 logger.warn("Index: " + index + ", Size of " + clazz.getSimpleName() + "'s Parameterized Type: " + params.length);140 return Object.class;141 } 142 if (!(params[index] instanceof Class)) { 143 logger.warn(clazz.getSimpleName() + " not set the actual class on superclass generic parameter");144 return Object.class;145 } 146 return (Class) params[index];147 } 148

149 /** 150 * 提取集合中的对象的属性,组合成List. 151 * 152 * @param collection 153 * 来源集合。

154 * @param propertityName 155 * 要提取的属性名。

156 */ 157 @SuppressWarnings("unchecked")

158 public static List fetchElementPropertyToList(final Collection collection, final String propertyName) throws Exception { 159

160 List list = new ArrayList();161

162 for (Object obj : collection) { 163 list.add(PropertyUtils.getProperty(obj, propertyName));164 } 165

166 return list;167 } 168

169 /** 170 * 提取集合中的对象的属性,组合成由分割符分隔的字符串。

171 * 172 * @param collection 173 * 来源集合。

174 * @param propertityName 175 * 要提取的属性名。

176 * @param separator 177 * 分隔符。

178 */ 179 @SuppressWarnings("unchecked")

180 public static String fetchElementPropertyToString(final Collection collection, final String propertyName, final String separator) throws Exception { 181 List list = fetchElementPropertyToList(collection, propertyName);182 return StringUtils.join(list.toArray(), separator);183 } 184 } 




免责声明:

本站系本网编辑转载,会尽可能注明出处,但不排除无法注明来源的情况,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责。如涉及作品内容、版权和其它问题,请在30日内与本网联系, 来信: liujun@soft6.com 我们将在收到邮件后第一时间删除内容!

[声明]本站文章版权归原作者所有,内容为作者个人观点,不代表本网站的观点和对其真实性负责,本站拥有对此声明的最终解释权。