java反射工具包,Java反射的应用

  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的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: