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<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, 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 |
} |
相关推荐
该工具类下载后拷贝到你要用的包,只需该包名即可
java的泛型和反射机制一直很难理解和应用,这个程序是关于反射和泛型的综合使用,主要实现获取一个类的属性名和方法,并可以获取属性值,存取属性值,属性名和属性值的字符...只是个工具类,没有写测试类,自己测试下啊
一个Java反射工具类,可以完成查询字段值以及设置字段值的功能。
这个“Java反射调用工具类”可能是为了简化和封装这些复杂的反射操作而创建的一个实用工具类。 首先,`JobProxy.java`可能是一个代理类,它利用反射来动态地调用目标对象的方法。在Java中,代理模式通常用于在不...
Java反射机制是Java编程语言中的一个强大特性,它允许程序在运行时检查和操作类、接口、字段和方法的信息。这个特性使得Java具备了高度的灵活性,能够在运行时动态地发现和使用类的属性和方法,即使这些信息在编译时...
提供以下几个功能: 1. 取最简类名 2. 动态赋值 3. 动态取值 4. 判断是否普通类型(自定义成员变量) 5. 动态取指定类的所有属性名
ReflectUtil java反射工具类
使用java 反射 将HttpServletRequest 中页面参数动态的注入到 javabean对象的辅助工具类,觉得还不错!
6. **反射API**:Java反射机制允许程序在运行时动态地获取类的信息(如类名、方法名)并调用它们,这在配置文件驱动的应用、插件系统和单元测试中十分有用。 7. **异常处理**:`Exception`类及其子类构成了Java的...
java * 反射工具类. 提供调用getter/setter方法, 访问私有变量, 调用私有方法, 获取泛型类型Class,java * 反射工具类. 提供调用getter/setter方法, 访问私有变量, 调用私有方法, 获取泛型类型Class,java * 反射工具...
进行数据库查询操作经常用到,包括getDeclaredField、getDeclaredMethod、getFieldValue、getSuperClassGenricType、getSuperGenericType、invokeMethod、makeAccessible、setFieldValue
java组件开发(13)反射工具类
java 反射工具类,适用于框架开发、平台建设等项目
JavaUtils工具类是Java开发中常见的一类辅助代码集合,它们通常包含各种静态方法,用于简化常见的编程任务,提高开发效率。这篇博文链接(已提供但无法直接访问)可能详细探讨了JavaUtils工具类的设计原则、常用方法...
反射工具类. 提供调用getter/setter方法, 访问私有变量, 调用私有方法, 获取泛型类型Class, 被AOP过的真实类等工具函数.反射工具类. 提供调用getter/setter方法, 访问私有变量, 调用私有方法, 获取泛型类型Class, 被...
在Java中,最著名的工具类库是`java.util`包,它包含了大量实用类,如集合、日期时间、数学计算、线程管理等。此外,还有一些第三方库,如Apache Commons Lang、Guava等,提供了更丰富的功能。 1. **java.util包**...
在Java中,`java.util`包就是这样一个包含大量工具类的包,提供了很多实用的功能。 1. **集合框架**:Java集合框架是Java中处理对象集合的核心部分,包括List、Set、Queue和Map等接口,以及ArrayList、LinkedList、...
### Java反射机制与动态加载实例类 在Java中,反射是一种强大的工具,允许程序在运行时检查和修改其结构和行为。通过反射,我们可以动态地加载类、创建对象、访问和修改字段、调用方法等。本文将深入探讨Java反射...