代码语言
.
CSharp
.
JS
Java
Asp.Net
C
MSSQL
PHP
Css
PLSQL
Python
Shell
EBS
ASP
Perl
ObjC
VB.Net
VBS
MYSQL
GO
Delphi
AS
DB2
Domino
Rails
ActionScript
Scala
代码分类
文件
系统
字符串
数据库
网络相关
图形/GUI
多媒体
算法
游戏
Jquery
Extjs
Android
HTML5
菜单
网页交互
WinForm
控件
企业应用
安全与加密
脚本/批处理
开放平台
其它
【
Java
】
Java反射工具类
作者:
磊.Y
/ 发布于
2011/10/26
/
904
反射的Utils函数集合. 提供访问私有变量,获取泛型类型Class,提取集合中元素的属性等Utils函数.
<div>package reflection;</div> import java.lang.reflect.Field; 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.List;</div> import org.apache.commons.beanutils.PropertyUtils; import org.apache.commons.lang.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.util.Assert;</div> <div>/** * 反射的Utils函数集合. 提供访问私有变量,获取泛型类型Class,提取集合中元素的属性等Utils函数. * * @author lei */ public class ReflectionUtils {</div> <div>private static Logger logger = LoggerFactory.getLogger(ReflectionUtils.class);</div> <div>private ReflectionUtils() { } <div>/** * 直接读取对象属性值,无视private/protected修饰符,不经过getter函数. */ public static Object getFieldValue(final Object object, final String fieldName) { Field field = getDeclaredField(object, fieldName);</div> if (field == null) throw new IllegalArgumentException("Could not find field [" + fieldName + "] on target [" + object + "]");</div> <div>makeAccessible(field);</div> <div>Object result = null; try { result = field.get(object); } catch (IllegalAccessException e) { logger.error("不可能抛出的异常{}", e.getMessage()); } return result; } <div>/** * 直接设置对象属性值,无视private/protected修饰符,不经过setter函数. */ public static void setFieldValue(final Object object, final String fieldName, final Object value) { Field field = getDeclaredField(object, fieldName);</div> if (field == null) throw new IllegalArgumentException("Could not find field [" + fieldName + "] on target [" + object + "]");</div> <div>makeAccessible(field);</div> <div>try { field.set(object, value); } catch (IllegalAccessException e) { logger.error("不可能抛出的异常:{}", e.getMessage()); } } <div>/** * 循环向上转型,获取对象的DeclaredField. */ protected static Field getDeclaredField(final Object object, final String fieldName) { Assert.notNull(object, "object不能为空"); return getDeclaredField(object.getClass(), fieldName); } <div>/** * 循环向上转型,获取类的DeclaredField. */ @SuppressWarnings("unchecked") protected static Field getDeclaredField(final Class clazz, final String fieldName) { Assert.notNull(clazz, "clazz不能为空"); Assert.hasText(fieldName, "fieldName"); for (Class superClass = clazz; superClass != Object.class; superClass = superClass.getSuperclass()) { try { return superClass.getDeclaredField(fieldName); } catch (NoSuchFieldException e) { // Field不在当前类定义,继续向上转型 } } return null; } <div>/** * 强制转换fileld可访问. */ protected static void makeAccessible(final Field field) { if (!Modifier.isPublic(field.getModifiers()) || !Modifier.isPublic(field.getDeclaringClass().getModifiers())) { field.setAccessible(true); } } <div>/** * 通过反射,获得定义Class时声明的父类的泛型参数的类型. 如public UserDao extends HibernateDao<User> * * @param clazz * The class to introspect * @return the first generic declaration, or Object.class if cannot be * determined */ @SuppressWarnings("unchecked") public static Class getSuperClassGenricType(final Class clazz) { return getSuperClassGenricType(clazz, 0); } <div>/** * 通过反射,获得定义Class时声明的父类的泛型参数的类型. 如public UserDao extends * HibernateDao<User,Long> * * @param clazz * clazz The class to introspect * @param index * the Index of the generic ddeclaration,start from 0. * @return the index generic declaration, or Object.class if cannot be * determined */</div> <div>@SuppressWarnings("unchecked") public static Class getSuperClassGenricType(final Class clazz, final int index) {</div> <div>Type genType = clazz.getGenericSuperclass();</div> if (!(genType instanceof ParameterizedType)) { logger.warn(clazz.getSimpleName() + "'s superclass not ParameterizedType"); return Object.class; } <div>Type[] params = ((ParameterizedType) genType).getActualTypeArguments();</div> 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]; } <div>/** * 提取集合中的对象的属性,组合成List. * * @param collection * 来源集合. * @param propertityName * 要提取的属性名. */ @SuppressWarnings("unchecked") public static List fetchElementPropertyToList(final Collection collection, final String propertyName) throws Exception {</div> <div>List list = new ArrayList();</div> <div>for (Object obj : collection) { list.add(PropertyUtils.getProperty(obj, propertyName)); } <div>return list; } <div>/** * 提取集合中的对象的属性,组合成由分割符分隔的字符串. * * @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 StringUtils.join(list.toArray(), separator); } } </div>
试试其它关键字
反射工具类
同语言下
.
List 切割成几份 工具类
.
一行一行读取txt的内容
.
Java PDF转换成图片并输出给前台展示
.
java 多线程框架
.
double类型如果小数点后为零则显示整数否则保留两位小
.
将图片转换为Base64字符串公共类抽取
.
sqlParser 处理SQL(增删改查) 替换schema 用于多租户
.
JAVA 月份中的第几周处理 1-7属于第一周 依次类推 29-
.
java计算两个经纬度之间的距离
.
输入时间参数计算年龄
可能有用的
.
C#实现的html内容截取
.
List 切割成几份 工具类
.
SQL查询 多列合并成一行用逗号隔开
.
一行一行读取txt的内容
.
C#动态修改文件夹名称(FSO实现,不移动文件)
.
c# 移动文件或文件夹
.
c#图片添加水印
.
Java PDF转换成图片并输出给前台展示
.
网站后台修改图片尺寸代码
.
处理大图片在缩略图时的展示
磊.Y
贡献的其它代码
(
2
)
.
MYSQL存储过程中使用游标嵌套的实例
.
Java反射工具类
Copyright © 2004 - 2024 dezai.cn. All Rights Reserved
站长博客
粤ICP备13059550号-3