核心反射机制(java.lang.reflect)
- 提供了通过程序访问已装载类信息的途径
- 给定一个Class实例,访问Constructor(构造器)、Method(方法)、Filed(域)
Constructor(构造器)、Method(方法)、Filed(域)实例使得你可以通过反射操作其底层对等体
- 通过调用底层类的实例上的方法,可以构造底层类实例、调用底层类的方法、访问底层类的域
- 例如Method.invoke 允许你调用任何对象的任何方法
- 反射机制允许一个类调用另一个类,即使前者被编译的时候,后者还不存在
反射需要付出代价
- 丧失了编译时类型检查的好处,包括异常检查
- 如果程序企图用反射调用不存在的类或方法,运行时会报错
- 执行反射访问所用到的代码笨拙、冗长
- 编写起来乏味、阅读起来困难
- 性能损失
- 反射方法调用比普通方法慢很多,亲测2倍~50倍不等
反射功能只能在设计时被用到
- 普通应用程序通常应该以正常方式访问到对象,而不是以反射
一些复杂应用程序需要以反射方式访问应用程序
- 比如类浏览器、对象监视器、代码分析器、解释型内嵌式系统
- 在RPC(远程调用)时,使用反射机制也很合适,这样不用存根编译器
如下,创建了一个Set<String>
- 传入参数是 java.util.HashSet、java.util.TreeSet
- 稍加修改可编程可编程通用的集合测试器、或通用的集合性能分析工具
上述实例演示反射机制俩缺点:
- 可能产生运行时错误,如果不用反射就是编译时错误
- 反射生成实例,代码冗长
System.exit(1)
- 程序中很少点用这个方法,会终止jvm
类对于运行时可能不存在的其他类、方法或者域的属性,使用反射进行管理是合理的,但是很少用
如果要编写一个包,需要依赖其他包的不同版本,使用反射就非常有用
- 这种方式允许使用最小环境进行编译,然后使用反射访问其他更新版本内容
反射机制是功能非常强大的机制
- 如果编写的程序必须与编译时未知的类一起工作,请仅仅使用反射创建新实例
- 使用实例的接口或者超类进行方法或域的访问