反射API的使用
反射通常被用在需要检查或修改其他运行在JVM中的程序的运行时行为的程序中。这是一种高级特性所以只建议对Java语言基础有深刻理解的开发人员使用。请牢记这个忠告,反射是一种强大的技术,它使得程序可以完成用其他手段不可能完成的任务。
-
可扩展性
- 程序可以通过使用类的完全限定名称( fully-qualified name)创建可扩展对象的实例来使用外部的或用户自定义的类。 类浏览器( Class Browser)和可视化开发环境
- 类浏览器需要有能力枚举类的数目。可视化开发环境可以借助使用反射获取到的类型信息帮助开发人员写出正确的代码 调试器(Debuggers)和测试工具
- 调试器需要有能力检查类中的私有(private)成员。自动化测试框架可以使用反射有组织地调用一个类的API以保证在测试中受测试代码被全面覆盖。
反射的缺点
反射是强大的,但却不应该随意使用。如果可以不使用反射而达到同样的效果那就不要用反射。使用反射时以下几点需牢记于心。
-
浪费性能
- 因为反射参与了动态处理的类型,所以JVM的一些优化措施会失效。所造成的后果便是,反射操作比不用反射的情况会有较差的性能,因此在对性能有要求的代码中应尽量避免使用。 安全性受限
- 反射需要运行时权限所以不能运行在安全管理器( security manager)下。这在对运行环境安全有较高要求时,比如Applet,尤其需要注意。 暴露内部结构
- 由于反射允许执行一些在不使用反射时会被视为非法(illeagal)的操作,比如访问私有(private)成员和方法,所以使用反射会造成意想不到的副作用(sede-effects),可能会造成代码功能异常或者丧失可移植性。反射会破坏代码的抽象(abstraction)因此使用了反射的代码可能会在系统升级后表现异常。
详细示例
示例涵盖了使用反射访问和操作类、字段、方法和构造方法的常见用法。每个部分都有示例代码、提醒和常见问题的分析。
- 这部分展示了获取一个Class对象的多种方式以及用该对象对类的各项属性进行检查,包括声明和内容。
- 这部分展示了如何使用反射API找出一个类的字段、方法和构造方法。例子涵盖了字段值的设置和获取,方法的调用以及使特定的构造方法创建对象的新实例。
-
数组和枚举类型
- 这部分介绍了两种特别的类:在运行时产生的数组,以及定义了唯一对象名实例的枚举类型。示例代码展示了如何获取一个数组的元素类型以及如何设置和获得数组或枚举类型中的字段。
类
成员
注意: