反射(Reflection)是Java程序开发语言的特征之一,它允许运行中的Java程序对自身进行检查,或者说“自审”,并能直接操作程序的内部属性和方法。
反射是一项高级开发人员应该掌握的“黑科技”,其实反射并不是Java独有的,许多编程语言都提供了反射功能。在面试中面试官也经常对反射问题进行考察,反射是所有注解实现的原理,尤其在框架设计中,有不可替代的作用。
关于反射,常见的面试考察点包括:
如何反射获取Class对象
如何反射获取类中的所有字段
如何反射获取类中的所有构造方法
如何反射获取类中的所有非构造方法
本篇我们就一起来学习一下Java反射机制。
一、反射是什么?
反射的概念是由Smith在1982年首次提出的,主要是指程序可以访问、检测和修改它本身状态或行为的一种能力。
通俗地讲,一提到反射,我们就可以想到镜子。镜子可以明明白白地照出我是谁,还可以照出别人是谁。反映到程序中,反射就是用来让开发者知道这个类中有什么成员,以及别的类中有什么成员。
二、为什么要有反射
有的同学可能会疑惑,Java已经有了封装为什么还要有反射呢?反射看起来像是破坏了封装性。甚至让私有变量都可以被外部访问到,使得类变得不那么安全了。
我们来看一下Oracle官方文档中对反射的描述:
UsesofReflection
ReflectioniscommonlyusedbyprogramswhichrequiretheabilitytoexamineormodifytheruntimebehaviorofapplicationsrunningintheJavavirtualmachine.Thisisarelativelyadvancedfeatureandshouldbeusedonlybydeveloperswhohaveastronggraspofthefundamentalsofthelanguage.Withthatcaveatinmind,reflectionisapowerfultechniqueandcanenableapplicationstoperformoperationswhichwouldotherwisebeimpossible.
ExtensibilityFeatures
Anapplicationmaymakeuseofexternal,user-definedclassesbycreatinginstancesofextensibilityobjectsusingtheirfully-qualifiednames.
ClassBrowsersandVisualDevelopmentEnvironments
Aclassbrowserneedstobeabletoenumeratethemembersofclasses.Visualdevelopmentenvironmentscanbenefitfrommakinguseoftypeinformationavailableinreflectiontoaidthedeveloperinwritingcorrectcode.
DebuggersandTestTools
Debuggersneedtobeabletoexamineprivatemembersonclasses.TestharnessescanmakeuseofreflectiontosystematicallycalladiscoverablesetAPIsdefinedonaclass,toinsureahighlevelofcodecoverageinatestsuite.
从Oracle官方文档中可以看出,反射主要应用在以下几方面:
反射让开发人员可以通过外部类的全路径名创建对象,并使用这些类,实现一些扩展的功能。
反射让开发人员可以枚举出类的全部成员,包括构造函数、属性、方法。以帮助开发者写出正确的代码。
测试时可以利用反射API访问类的私有成员,以保证测试代码覆盖率。
也就是说,Oracle希望开发者将反射作为一个工具,用来帮助程序员实现本不可能实现的功能(performoperationswhichwouldotherwisebeimpossible)。正如《人月神话》一书中所言:软件工程没有银弹。很多程序架构,尤其是三方框架,无法保证自己的封装是完美的。如果没有反射,对于外部类的私有成员,我们将一筹莫展,所以我们有了反射这一后门,为程序设计提供了更大的灵活性。工具本身并没有错,关键在于如何正确地使用。
以上就是动力节点java培训机构的小编针对“Java基础学习:java反射实现机制”的内容进行的回答,希望对大家有所帮助,如有疑问,请在线咨询,有专业老师随时为你服务。
你适合学Java吗?4大专业测评方法
代码逻辑 吸收能力 技术学习能力 综合素质
先测评确定适合在学习