Java 中的反射

概念

Java 反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为 Java 语言的反射机制。

一般静态类型的语言写的程序,都有这么几个周期,编译------>链接(在 Java 中也可以叫类加载)------->运行。
一般动态类型的语言写的程序,只有运行期,代码会被边解析边执行,而不会去先编译。
由于 Java 是静态类型语言,所以反射可以理解为把一些要做的事从链接期延迟到了运行期去做

为什么需要反射

我们需要对象直接 new 就行,那么为什么要有 Java 反射机制呢?

java的反射机制就是增加程序的灵活性,避免将程序写死到代码里,例如: 实例化一个 person()对象,不使用反射,new person(); 如果想变成实例化其他类,那么必须修改源代码,并重新编译。(这是不是很烦,尤其是项目上线后更烦)

使用反射: class.forName(“person”).newInstance();我们把一些后期会频繁改动的类用反射来加载,因为反射加载类只需要类的描述信息,而且这个类描述可以写到配置文件中,如 **.xml,用这个xml来管理, 这样如果想实例化其他类,只要修改配置文件的"类描述"就可以了,不需要重新修改代码并编译。有没有发现这也很好达到来解耦的效果。

思想:把频繁发生变化的代码的元信息抽出来放到配置文件中,利用反射去动态解析。在运行过程中根据这些元信息去完成相应的功能。

所以说利用反射机制,主要能增加程序的灵活性。如SpringMVC,struts中,请求的派发控制。当请求来到时,SpringMVC通过查询配置文件,找到该请求对应的action,然后通过反射实例化action,并调用响应 method。

如果不想用反射也是可以的,不过你就只能把这些类的调用写死到代码里了,这肯定是个灾难,一来管理麻烦,耦合太高,二来代码量会非常大,三来代码里会频繁的出现判断的语句…

而且反射机制可以动态的去调用一些 protected 甚至是private 的方法或类,这样可以很大程度上满足我们的一些比较特殊需求。例子见:http://blog.csdn.net/wwww1988600/article/details/22884371(很简短的一个demo)

优点

可以使得程序拥抱变化,降低耦合,增加程序的灵活性。

缺点

尽管反射非常强大,但也不能滥用。因为:

  1. java反射需要将内存中的对象进行解析,涉及到与底层 c 语言的交互,速度会比较慢。

  2. 使用反射技术要求程序必须在一个没有安全限制的环境中运行,如果一个程序必须在有安全限制的环境中运行,如Applet,那么这就是个问题了。

  3. 由于反射允许代码执行一些在正常情况下不被允许的操作(比如访问私有的属性和方法),所以使用反射可能会导致意料之外的副作用--代码有功能上的错误,降低可移植性。反射代码破坏了抽象性,因此当平台发生改变的时候,代码的行为就有可能也随着变化。

所以大多情况下我们是不需要用反射的,而反射机制一般框架中使用较多,因为框架要适用更多的情况,对灵活性要求较高。

参考链接:https://www.ctolib.com/topics-82289.html

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值