反射(详解)

反射

什么时反射?

        反射允许对成员变量,成员方法和构造方法的信息进行编程访问。

 

 

 

--------------------------------------------------------------------------------------

  • 反射(Reflection)
    • 运行状态中,对于任意一个类都能够知道这个类所有的属性和方法;并且对于任意一个对象,都能够调用它的任意一个方法;这种动态获取信息以及动态调用对象方法的功能成为 Java 语言的反射机制。
  • 深入理解
    • 反射使我们在运行时看清一个类的运行情况并使用
    • 反射是Java被视为动态或准动态语言的关键特性
    • 反射允许程序在运行时加载、探查、使用一个在编译期可能未知的类

-------------------------------------------------------------------------------

使用反射的步骤:

  • 获取想要操作的类的 Class 对象
  • 调用Class类中的方法
  • 使用反射API来操作这些信息

-------------------------------------------------------------------------------

Class类常用方法:

  • 获取属性
    • getFields() -所有可访问的公共字段
    • getDeclaredFields() -所有字段
    • getField(String name) -返回一个特定的公共字段对象
  • 获取方法
    • getMethods() -所有公共方法,包括从超类和超接口继承的声明
    • getDeclaredMethods() -所有方法,包括公共,保护,默认(包)访问和私有方法,但不包括继承的方法
    • getMethod(String name, Class[ ] parameterTypes) -返回一个方法对象
  • 获取构造方法
    • 获取构造方法
      • getConstructor(Class[] parameterTypes) -返回一个构造方法对象
    • 通过 Constructor-newInstance(Object[] initargs) 可生成类的实例
    • 通过Method-invoke(Object obj,Object[] args),可在具有指定参数的方法对象上调用此方法对象表示的基础方法

-------------------------------------------------------------------------------

反射优缺点

优点:

  • 运行期类型的判断,动态类加载
  • 提高了程序的灵活性、扩展性、降低耦合性
  • 提高自适应能力,无需提前硬编码目标类

缺点:

  • 性能问题
  • 安全限制
  • 内部暴露

反射应用场景

  • 反射机制是目前众多Java框架实现的基础
    • JDBC
    • Hibernate
    • Spring AOP、IoC
    • 分布式微服 
  • 实现项目安装插件功能
  • 基于反射,架构师搭建项目框架,自行封装框架,使得项目更加组件化和通用化

-------------------------------------------------------------------------------

总结

  • 什么是反射?
    • 关键点:运行状态、动态获取信息、生成类的实例以及动态调用对象 方法
  • 反射API(类及方法)
    • java.lang.class;
      • forName()、newInstance()
      • getFields()等、getMethods()等、getConstructor()
    • java.lang.reflect.Field;
      • getName()
    • java.lang.reflect.Method;
      • getName()、invoke()
    • java.lang.reflect.Constructor;
      • newInstancce()
  • 实操
    • 基于反射获取类信息(构造方法、属性、方法)
    • 基于反射生成类的实例
    • 基于反射动态调用对象方法

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/26245.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【V8】【1. 内存布局、隐藏类Hidden Class】

JavaScript 中的对象是由一组组属性和值的集合。JavaScript 对象像一个字典,字符串作为键名,任意对象可以作为键值,可以通过键名读写键值。 在 ECMAScript 规范中定义了数字属性应该按照索引值大小升序排列,字符串属性根据创建时…

FasterViT实战:使用FasterViT实现图像分类任务(一)

文章目录 摘要安装包安装timm安装 grad-cam 数据增强Cutout和MixupEMA项目结构计算mean和std生成数据集 摘要 论文翻译:https://blog.csdn.net/m0_47867638/article/details/131542132 官方源码:https://github.com/NVlabs/FasterViT 这是一篇来自英伟…

初学者怎么学习c++(合集)

学习c方法1 找一本好的书本教材,辅助看教学视频。好的教材,可以让你更快更好的进入C/C的世界。在校学生的话,你们的教材通常都是不错的。如果是自学,推荐使用谭浩强出的C/C经典入门教材。看视频是学习比较直观的方式。建议先看课本…

Smartbi 身份认证绕过漏洞

0x00 简介 Smartbi是广州思迈特软件有限公司旗下的商业智能BI和数据分析产品,致力于为企业客户提供一站式商业智能解决方案。 0x01 漏洞概述 Smartbi在安装时会内置三个用户(public、service、system),在使用特定接口时&#x…

高压放大器需要注意哪些指标

高压放大器是一种专门用于输出高电压信号的电子设备,主要应用于精密测量、医疗设备、电力电子等领域中。在选择高压放大器时,需要注意其性能指标,以确保设备的稳定性和可靠性。 以下是高压放大器需要注意的性能指标: 输出电压范围…

利用ArcGIS Pro制作三维效果图

1、新建工程 打开Arcgispro,新建工程,这里我们要用到的模板为全局场景。 2、添加数据 这里添加的数据需要有一个字段内容是数值的,这个字段也是接下来要进行拉伸的字段。 3、高度拉伸 数据添加进来后,如下图所示,这时图层处于2D图层里。 这时我们点中该图层,回到菜单栏…

Spring Cloud Gateway下的GC停顿排查之旅

01 背景 在微服务架构体系流行的当下,Spring Cloud全家桶已经是大多数团队的首选,我们也不例外,并且选择了Spring Cloud Gateway作为了业务网关,进行了一些通用能力的开发,如鉴权、路由等等。作为一个成熟的框架&#…

如何学习Java集合框架? - 易智编译EaseEditing

要学习Java集合框架相关的技术和知识,可以按照以下步骤进行: 掌握Java基础知识: 在学习集合框架之前,确保你已经具备良好的Java编程基础,包括语法、面向对象编程(OOP)原理和常用的核心类库等。…

win10电脑出现网络问题时,如何解决?

我们的Windows可能会出现各种网络连接问题: 尝试连接Wi-Fi网络时出现错误:Windows无法连接到此网络;可以通过Wifi访问互联网,但通过电缆访问以太网却无法正常工作;尝试通过电缆连接互联网时出现错误: Wind…

ios 启动页storyboard 使用记录

本文简单记录ios启动页storyboard 如何使用和注意事项。 xcode窗口简介 以xcode14为例,新建项目如下图,左边文件栏中的LaunchScreen.storyboard 为默认启动页布局。窗口中间部分是storyboard中的组件列表,右侧为预览,可以看到渲…

goland设置内置命令行为当前项目环境

goland设置内置的命令行为当前项目环境 修改 GoLand 中的 SSH 终端配置即可

Python正则表达式校验某个字符串是否是合格的email

Python正则表达式校验某个字符串是否是合格的email 可以借助正则表达式校验某个字符串是否是合规的电子邮箱。对于邮箱的正则表达式有严格的模式,如:^[a-zA-Z0-9_&*-](?:\\.[a-zA-Z0-9_&*-])*(?:[a-zA-Z0-9-]\\.)[a-zA-Z]{2,7}$ 对应的Python…