java反射工具包,Java反射的应用
导入龙目岛。外部人员。SLF 4j。SLF 4j;
导入Java。郎。反思。*;
/**
* 反射的实用工具函数集合
* 提供访问私有变量,获取泛型类型类,提取集合中元素属性等实用工具函数
*/
@Slf4j
公共类ReflectionUtils {
/**
* 直接读取对象的属性值,忽略私人/受保护修饰符,也不经过吸气剂
*
* @param对象
* @param fieldName
* @返回
*/
公共静态对象getFieldValue(Object对象,字符串字段名){
field field=getDeclaredField(对象,字段名);
if (field==null) {
引发新的IllegalArgumentException(在目标[ object ]上找不到字段[字段名]);
}
使可访问性(字段);
对象结果=空
尝试{
result=field.get(对象);
} catch(IllegalAccessException e){
log.error(getFieldValue:,e);
}
返回结果;
}
/**
* 直接设置对象属性值,忽略私人/受保护修饰符,也不经过作曲者
*
* @param对象
* @param fieldName
* @param值
*/
public static void setfield value(Object Object,String fieldName,Object value) {
field field=getDeclaredField(对象,字段名);
if (field==null) {
引发新的IllegalArgumentException(在目标[ object ]上找不到字段[字段名]);
}
使可访问性(字段);
尝试{
field.set(对象,值);
} catch(IllegalAccessException e){
log.error(setFieldValue:,e);
}
}
/**
* 通过反射,获得定义班级时声明的父类的泛型参数的类型
* 如:公共雇员道扩展库连接和关闭类雇员,字符串
*
* @param clazz
* @param索引
* @返回
*/
@SuppressWarnings(未选中)
公共静态类getSuperClassGenricType(Class clazz,int index) {
类型genType=clazz。getgenericsuperclass();
如果(!(参数化类型的genType实例)){
返回对象.类
}
type[]params=((参数化类型)genType).getActualTypeArguments();
if(index=params。长度 索引0){
返回对象.类
}
如果(!(类的params[index]实例)){
返回对象.类
}
return(Class)params[index];
}
/**
* 通过反射,获得班级定义中声明的父类的泛型参数类型
* 如:公共雇员道扩展库连接和关闭类雇员,字符串
*
* @param T
* @param clazz
* @返回
*/
@SuppressWarnings(未选中)
public static T Class T getSuperGenericType(Class clazz){
返回getSuperClassGenricType(clazz,0);
}
/**
* 循环向上转型,获取对象的声明方法
*
* @param对象
* @param methodName
* @param参数类型
* @返回
*/
公共静态方法getDeclaredMethod(对象对象,字符串methodName,Class。[]参数类型){
对于(类?超类=对象。getclass();超一流!=Object.classsuper class=超类。get超类()){
尝试{
返回超一流。getdeclaredmethod(方法名,参数类型);
} catch(NoSuchMethodException e){
//方法不在当前类定义,继续向上转型
}
}
返回空
}
/**
* 使提出申请变为可访问
*
* @param字段
*/
公共静态void使可访问(字段Field){
如果(!修饰语。是公共的(字段。get修饰符()){
场。设置可访问性(true);
}
}
/**
* 循环向上转型,获取对象的声明字段
*
* @param对象
* @param filedName
* @返回
*/
公共静态字段getDeclaredField(Object object,String filedName) {
对于(类?超类=对象。getclass();超一流!=Object.classsuper class=超类。get超类()){
尝试{
返回超一流。getdeclaredfield(filedName);
} catch (NoSuchFieldException e) {
//字段不在当前类定义,继续向上转型
}
}
返回空
}
/**
* 直接调用对象方法,而忽略修饰符(私人,受保护)
*
* @param对象
* @param methodName
* @param参数类型
* @param参数
* @返回
* @ throws InvocationTargetException
* @ throws IllegalArgumentException
*/
公共静态对象invokeMethod(对象对象,字符串methodName,Class。[]参数类型,
对象[]参数)引发InvocationTargetException {
方法method=getDeclaredMethod(object,methodName,parameter types);
if (method==null) {
引发新的IllegalArgumentException(在目标[ object ]上找不到方法[ method name ]);
}
method . set accessible(true);
尝试{
返回method.invoke(对象,参数);
} catch(IllegalAccessException e){
log.error(invokeMethod:,e);
}
返回null
}
}Kotlin开发者社区
微信官方账号,国内首个Kotlin开发者社区,主要分享和交流Kotlin编程语言、React.js/Node.js, Spring Boot、安卓、函数式编程、编程思路等相关话题。
越是喧嚣的世界,越需要安静的思考。
版权归作者所有:来自博主的禅与计算机编程艺术原创作品,转载授权请联系作者,否则将追究法律责任。
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。