千家信息网

反射可以做什么

发表于:2025-01-20 作者:千家信息网编辑
千家信息网最后更新 2025年01月20日,反射可以做什么,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。在Java中,想要运行时操作对象的方法、属性,其中有效的手段,就有反射。
千家信息网最后更新 2025年01月20日反射可以做什么

反射可以做什么,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。

在Java中,想要运行时操作对象的方法、属性,其中有效的手段,就有反射。这也是框架最常使用的手段,因为框架在编译时并不知晓系统中有哪些类会被使用。

Java中对象的类型信息在运行时由Class对象表示,Class对象是伴随类加载而实例化产生的,而反射的实现就围绕着Class对象。

有很多种方式可以获取类的Class对象,包括:

Class c1 = Object.class; Class c2 = Class.forName("java.lang.Object"); Class c3 = new Object().getClass();

反射可以做什么?

1. 实例化对象

对象的实例化,可以通过new关键字直接实例化,也可以通过反射,例如:

class.newInstance()  class.getConstructor(Class... parameterTypes).newInstance(Object ... initargs)

为什么需要用反射来进行对象实例化?

有不能使用new关键字直接实例化对象的场景,例如:Spring容器管理的Bean,只能通过类的全限定名加载类,然后反射实例化。

在不想使用new关键字的场景,目的是为了简化编程,使代码美观,可能大家经常看到类似的用法,例如:

public static  T parseObject(String text, Class clazz) {   return parseObject(text, clazz, new Feature[0]); }
/** * 简单的复制出新类型对象 */ public static  D map(S source, Class destinationClass){   return mapper.map(source, destinationClass); }

2. 筛选合适的类

实际开发中,经常会有这种需要,如果类有某某特征,就进行某某操作。在Spring进行扫描的时候,我们会通过过滤器,来精细化控制bean的生成,包括:

  1. 鸿蒙官方战略合作共建--HarmonyOS技术社区

  2. 根据isInstance(Object obj)判断是否实现某某接口或者继承特殊的父类;

  3. 根据isAnnotationPresent(Class annotationClass)判断是否被注解标记。

3. 方法调用

有些场景不能或者不合适直接调用方法,例如:我们处理HTTP请求,需要从URI映射到方法调用,如果我们能够穷举所有的URL到对象方法的映射关系,那么也没问题,但是无数的if条件判断,显然不是明智的选择。

通常我们先会获取资源对象,然后反射调用对象的方法。

Method.invoke(Object obj, Object... args)

如何获取对象的方法对象,也就是Method对象呢?Class类提供了以下实现:

Method[] getMethods(); Method[] getDeclaredMethods(); Method getMethod(String name, Class... parameterTypes); Method getDeclaredMethod(String name, Class... parameterTypes);

这些方法可以分为两类:

  1. 鸿蒙官方战略合作共建--HarmonyOS技术社区

  2. 方法签名中带有Declared的,会在当前类的所有方法中查找,但不会遍历父类。

  3. 不带Declared的会遍历所有父类,但只会查找public方法。

推荐使用工具类:org.apache.commons.lang3.reflect.MethodUtils 此类中包含遍历所有父类查找方法、当前类查找public方法或者反射执行方法的便捷操作。

4. 属性操作

Class.getFields(), Class.getField(String),  Class.getDeclaredFields(), Class.getDeclaredField(String)

命名规则同方法,推荐使用工具类:org.apache.commons.lang3.FieldUtils,进行读取或者赋值操作。

反射进行赋值有几点需要注意:

  1. 鸿蒙官方战略合作共建--HarmonyOS技术社区

  2. 如果不为public类型,那么设置字段前必须通过Field.setAccessible(true)方法进行访问权限设置,不然会抛出异常:IllegalAccessException 。

  3. 如果字段为static类型,那么通过set方法进行赋值时,会忽略obj对象,因为静态字段属于类。

  4. 如果字段为final类型,不管是public还是 private,那么用set方法赋值时,只有setAccessible进行访问权限设置后,才能正确调用,不然会报异常:IllegalAccessException。但是对final字段进行set方法赋值时,尽管方法正常调用,但是并不会改变fianl字段的值。

  5. 如果字段为final static 类型,那么进行set方法赋值时,总会抛出IllegalAccessException异常。

关于反射可以做什么问题的解答就分享到这里了,希望以上内容可以对大家有一定的帮助,如果你还有很多疑惑没有解开,可以关注行业资讯频道了解更多相关知识。

方法 对象 反射 字段 实例 类型 问题 关键 关键字 场景 官方 战略 技术 社区 鸿蒙 合作 合适 可以通过 属性 工具 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 公司治理 数据库 法制讲座观后感关于网络安全 贵州it软件开发公司 山东东略网络技术有限公司 魔兽世界开门任务各服务器统计 刀剑乱舞 国服服务器 阿里云渲染服务器上线了吗 宁波手机软件开发培训班 我国现有中外数据库多少个 滴滴的软件开发岗怎么样 linux服务器切换到新服务器 新加坡服务器游戏充值 谷歌800万台服务器 网络技术培训优缺点 服务器B1OS的启动模式有哪些 第五人格欧美服务器怎么才能不卡 中宁县软件开发技术靠谱吗 嘉定区创新数据库价钱 通辽网络安全指挥中心考什么 西安鹏睿互联网科技有限公司 服务器怕啥 数据模型对应数据库设计那个步骤 上海推广机器人rpa软件开发 广联达云授权状态访问服务器异常 网络安全关机检查什么意思 为什么服务器会出现维护 阿里云服务器是正品吗 网络安全法的网络安全内容是 免费服务器收点卡 查询数据库中列数据一样的行
0