反射的概念与作用

反射的概念:

反射,一种计算机处理方式。是程序可以 访问、检测和修改它本身状态或行为的一种能力
Java 反射可以于运行时加载,探知和使用编译期间完全未知的类.
程序在 运行状态中, 可以动态加载一个只有名称的类, 对于任意一个已 经加载的类,都能够知道这个类的所有属性和方法; 对于任意一个对象, 都能调用他的任意一个方法和属性;
加载完类之后, 在堆内存中会产生一个 Class 类型的对象( 一个类只有一个 Class 对象 ), 这个对象包含了 完整的类的结构信息 ,而且 这个 Class 对象就像一面镜子,透过这个镜子看到类的结构, 所以被称之为:反射.
java 反射使得我们可以在程序 运行时动态加载一个类,动态获取类的基 本信息和定义的方法,构造函数,域等
除了检阅类信息外,还可以 动态创建类的实例,执行类实例的方法,获 取类实例的域值 。反射使 java 这种 静态语言有了动态的特性

反射的作用:

通过反射可以使程序代码 访问装载到 JVM(字节码转为机器码) 中的类的内部信息
1) 获取已装载类的属性信息
2) 获取已装载类的方法
3) 获取已装载类的构造方法信息
反射的优点:
增加程序的灵活性。使java这种静态语言具有动态的特性
大多数情况下反射是为了提高程序的灵活性。因此一般框架中使用较多。因为框架要适用更多的情况。对灵活性要求较高。 反射的概念可以通过以下生活例子来解释:
假设你是一名瑜伽教练,而你的教室里有许多不同类型的瑜伽器材,比如瑜伽球、瑜伽垫和瑜伽绳。每天当学生进入教室 (容器) 时,你必须根据每个学生的需求,为他们提供适当的瑜伽器材。

在这个例子中,瑜伽教练就是程序,而瑜伽器材就是类。正常情况下,你可能要通过直接调用每个器材的名称来提供。比如,当一个学生需要瑜伽球(类)时你会直接拿个瑜伽球(new 瑜伽球)给他。

但是,如果你使用了反射,你可以提高自己的灵活性。你可以让每个瑜伽器材都具有相同的方法和属性(提高代码复用性),比如获取器材的名称和类型。当学生进入教室时,你可以检查他们的需求(class),并使用反射来动态获取适当的瑜伽器材类,并为他们提供所需的器材。这样,当有新的瑜伽器材被添加到教室中时,你不需要修改你的代码(每个瑜伽器材都具有相同的方法和属性),因为你可以通过反射来动态获取新的瑜伽器材。

这个例子展示了反射的作用:通过反射,你可以在不预先知道具体类或对象的情况下,动态地获取类的信息和方法,并进行相应的操作。这样可以增加程序的灵活性,使得程序的行为可以根据运行时的情况进行动态的调整和处理

反射的主要作用如下:

1. 动态加载类:通过反射可以在运行时动态加载并实例化类。这使得程序可以根据配置文件或用户输入的类名来动态创建对象,从而增加了程序的灵活性和可扩展性。 控制反转

2. 动态获取类的信息:通过反射可以获取类的构造方法、方法、字段等相关信息,包括访问修饰符、参数类型、返回类型等。这样可以在运行时根据需求动态调用对应的方法或访问字段

3. 动态调用方法:通过反射可以在运行时动态调用方法,无论方法是公有的还是私有的。这使得程序可以在运行时根据情况动态执行不同的方法,扩展了程序的功能和灵活性。

4. 动态修改属性:通过反射可以动态修改对象的字段值,包括私有字段。这在某些特殊场景下非常有用,比如在测试中修改私有字段的值以模拟不同的情况

5. 创建动态代理:通过反射可以创建动态代理对象,利用代理对象可以拦截方法调用并在方法执行前后添加额外逻辑。这在实现AOP(面向切面编程)时非常常用。

反射虽然提供了很大的灵活性,但也会带来一定的性能损耗,且不安全。

假设你有一个汽车修理店,你需要根据不同车辆的品牌和型号来修理汽车。而且每个品牌和型号的汽车可能有不同的维修手册和维修流程。

当有一辆来自品牌A的车辆需要修理时,你可以使用反射获取到该车辆的品牌信息和维修手册。根据维修手册中的说明,你可以动态调用品牌A汽车的特定维修方法,比如更换发动机零件,检查电路等。而当另一辆来自品牌B的车辆需要修理时,你同样可以通过反射获取到该车辆的品牌信息和维修手册,并动态调用品牌B汽车的特定维修方法

通过反射机制,你可以在不改变代码的情况下(利用反射获取A类或B类等的代码都不需要修改),根据不同车辆的信息动态调用相应的维修方法,使得修理店能够应对各种不同品牌和型号的车辆,提高了修理店的服务水平和效率

假设你是一位演员(演员类),正在参演一部戏剧(运行)。反射就好像是你在排练过程中使用的一面镜子。在排练开始之前,你并不知道你将扮演的角色(什么样的实例化对象)是谁,你只知道自己是一名演员(演员类)。这就好比在Java中,你并不知道类的具体信息,只知道有一个类存在。

当你拿起镜子时,你可以通过镜子观察自己的形象和表情。镜子就像是反射中的Class对象,它可以反映出你的外貌、身材、面部表情等。通过镜子,你可以动态地获取关于自己(演员类)的信息。

在排练过程中,导演(开发)会告诉你要如何表演,你需要根据导演的指示进行动作和台词的表演。这就好比在Java中,你可以通过反射动态调用方法。你通过观察并根据导演的指示来进行表演,就像在运行时根据反射获取方法信息并调用方法。此外,如果你需要在戏剧中改变自己的形象,比如化妆或更换服装,你可以使用镜子(Class)来观察和调整自己的外貌。这类似于使用反射来动态修改对象的属性值。

因此,反射就像是你在演戏中使用的镜子,它允许你在运行时动态地观察、修改和调用对象的信息,增加了程序的灵活性和扩展性,就像演员(对象)可以通过观察镜子(class)来调整自己的形象和表演一样。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值