浅析Java 反射机制的用途和缺点
反射的用途UsesofReflection
Reflectioniscommonlyusedbyprogramswhichrequiretheabilitytoexamineormodifythe
runtimebehaviorofapplicationsrunningintheJavavirtualmachine.Thisisarelativelyadvanced
featureandshouldbeusedonlybydeveloperswhohaveastronggraspofthefundamentalsofthelanguage.Withthatcaveatinmind,reflectionisapowerfultechniqueandcanenableapplicationstoperformoperationswhichwouldotherwisebeimpossible.
反射被广泛地用于那些需要在运行时检测或修改程序行为的程序中。这是一个相对高级
的特性,只有那些语言基础非常扎实的开发者才应该使用它。如果能把这句警示时刻放在心
里,那么反射机制就会成为一项强大的技术,可以让应用程序做一些几乎不可能做到的事情。
反射的缺点DrawbacksofReflection
Reflectionispowerful,butshouldnotbeusedindiscriminately.Ifitispossibletoperforman
operationwithoutusingreflection,thenitispreferabletoavoidusingit.Thefollowingconcerns
shouldbekeptinmindwhenaccessingcodeviareflection.
尽管反射非常强大,但也不能滥用。如果一个功能可以不用反射完成,那么最好就不用。
在我们使用反射技术时,下面几条内容应该牢记于心:
性能第一PerformanceOverhead
Becausereflectioninvolvestypesthataredynamicallyresolved,certainJavavirtualmachine
optimizationscannotbeperformed.Consequently,reflectiveoperationshaveslowerperformance
thantheirnon-reflectivecounterparts,andshouldbeavoidedinsectionsofcodewhicharecalled
frequentlyinperformance-sensitiveapplications.
反射包括了一些动态类型,所以JVM无法对这些代码进行优化。因此,反射操作的效
率要比那些非反射操作低得多。我们应该避免在经常被执行的代码或对性能要求很高的程
序中使用反射。
安全限制SecurityRestrictions
Reflectionrequiresaruntimepermissionwhichmaynotbepresentwhenrunningundera
securitymanager.Thisisinanimportantconsiderationforcodewhichhastoruninarestricted
securitycontext,suchasinanApplet.
使用反射技术要求程序必须在一个没有安全限制的环境中运行。如果一个程序必须在有
安全限制的环境中运行,如Applet,那么这就是个问题了。
内部暴露ExposureofInternals
Sincereflectionallowscodetoperformoperationsthatwouldbeillegalinnon-reflective
code,suchasaccessingprivatefieldsandmethods,theuseofreflectioncanresultin
unexpectedside-effects,whichmayrendercodedysfunctionalandmaydestroyportability.
Reflectivecodebreaksabstractionsandthereforemaychangebehaviorwithupgradesofthe
platform.
由于反射允许代码执行一些在正常情况下不被允许的操作(比如访问私有的属性和方
法),所以使用反射可能会导致意料之外的副作用--代码有功能上的错误,降低可移植性。
反射代码破坏了抽象性,因此当平台发生改变的时候,代码的行为就有可能也随着变化。