`

实用的Java反射工具类

 
阅读更多

 

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, finalObject 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<User>
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<User,Long>
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, finalString 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 }

 

分享到:
评论

相关推荐

    java反射工具类 ReflectionUtils

    该工具类下载后拷贝到你要用的包,只需该包名即可

    java反射工具类

    java的泛型和反射机制一直很难理解和应用,这个程序是关于反射和泛型的综合使用,主要实现获取一个类的属性名和方法,并可以获取属性值,存取属性值,属性名和属性值的字符...只是个工具类,没有写测试类,自己测试下啊

    一个Java反射工具类,可以完成查询字段值以及设置字段值的功能

    一个Java反射工具类,可以完成查询字段值以及设置字段值的功能。

    Java反射调用工具类

    这个“Java反射调用工具类”可能是为了简化和封装这些复杂的反射操作而创建的一个实用工具类。 首先,`JobProxy.java`可能是一个代理类,它利用反射来动态地调用目标对象的方法。在Java中,代理模式通常用于在不...

    java反射机制工具类

    Java反射机制是Java编程语言中的一个强大特性,它允许程序在运行时检查和操作类、接口、字段和方法的信息。这个特性使得Java具备了高度的灵活性,能够在运行时动态地发现和使用类的属性和方法,即使这些信息在编译时...

    Java反射工具类

    提供以下几个功能: 1. 取最简类名 2. 动态赋值 3. 动态取值 4. 判断是否普通类型(自定义成员变量) 5. 动态取指定类的所有属性名

    ReflectUtil java反射工具类

    ReflectUtil java反射工具类

    java 反射注入工具类

    使用java 反射 将HttpServletRequest 中页面参数动态的注入到 javabean对象的辅助工具类,觉得还不错!

    牛逼的java常用工具类

    6. **反射API**:Java反射机制允许程序在运行时动态地获取类的信息(如类名、方法名)并调用它们,这在配置文件驱动的应用、插件系统和单元测试中十分有用。 7. **异常处理**:`Exception`类及其子类构成了Java的...

    java * 反射工具类. 提供调用getter/setter方法, 访问私有变量, 调用私有方法, 获取泛型类型Class

    java * 反射工具类. 提供调用getter/setter方法, 访问私有变量, 调用私有方法, 获取泛型类型Class,java * 反射工具类. 提供调用getter/setter方法, 访问私有变量, 调用私有方法, 获取泛型类型Class,java * 反射工具...

    反射工具类ReflectionUtils.java

    进行数据库查询操作经常用到,包括getDeclaredField、getDeclaredMethod、getFieldValue、getSuperClassGenricType、getSuperGenericType、invokeMethod、makeAccessible、setFieldValue

    java组件开发(13)反射工具类

    java组件开发(13)反射工具类

    java 反射工具类,适用于框架开发、平台建设等项目

    java 反射工具类,适用于框架开发、平台建设等项目

    java utils 工具类

    JavaUtils工具类是Java开发中常见的一类辅助代码集合,它们通常包含各种静态方法,用于简化常见的编程任务,提高开发效率。这篇博文链接(已提供但无法直接访问)可能详细探讨了JavaUtils工具类的设计原则、常用方法...

    java 反射工具类. 提供调用getter/setter方法, 访问私有变量, 调用私有方法, 获取泛型类型Class

    反射工具类. 提供调用getter/setter方法, 访问私有变量, 调用私有方法, 获取泛型类型Class, 被AOP过的真实类等工具函数.反射工具类. 提供调用getter/setter方法, 访问私有变量, 调用私有方法, 获取泛型类型Class, 被...

    Java常用工具类

    在Java中,最著名的工具类库是`java.util`包,它包含了大量实用类,如集合、日期时间、数学计算、线程管理等。此外,还有一些第三方库,如Apache Commons Lang、Guava等,提供了更丰富的功能。 1. **java.util包**...

    java常用工具类

    在Java中,`java.util`包就是这样一个包含大量工具类的包,提供了很多实用的功能。 1. **集合框架**:Java集合框架是Java中处理对象集合的核心部分,包括List、Set、Queue和Map等接口,以及ArrayList、LinkedList、...

    Java反射动态加载实例类

    ### Java反射机制与动态加载实例类 在Java中,反射是一种强大的工具,允许程序在运行时检查和修改其结构和行为。通过反射,我们可以动态地加载类、创建对象、访问和修改字段、调用方法等。本文将深入探讨Java反射...

Global site tag (gtag.js) - Google Analytics