反射
概念:
每个类都有一个Class对象,包含了与类相关的信息。当编译一个新类时,会产生一个同名的.Class文件,该文件内保存着Class对象
类加载相当于Class对象的加载,类在第一次使用时才动态加载到JVM中,也可以使用class.forName(“com.mysql.jdbc.Driver”)这种方式来控制类的加载,该方法会返回一个Class对象
反射可以提供运行时类的信息,并且这个类可以在运行时才加载进来,甚至在编译时期的.class不存在也可以加载进来。
反射的优点:
可扩展性
可以使用全限定名创建可扩展对象实例,来自外部的用户可以自定义类
提供类浏览器的可视化开发环境
可视化的开发环境可以利用反射中可用的类型信息,帮助程序员正确编写代码
调试器和测试工具
调试器能够检测类的私有成员,测试工具可以利用来调用API定义,从而确保测试中有较高的代码覆盖率
反射的缺点:
性能开销
反射涉及动态类型的解析,JVM无法对代码进行优化。反射操作效率要比非反射效率低很多。
安全限制
反射要求程序必须在没有安全限制的环境中运行
内部暴露
反射允许代码执行一些正常情况不被允许的操作,使用反射会导致意料之外的副作用,导致功能失调,破坏可移植性