这篇Java教程基于JDK1.8。教程中的示例和实践不会使用未来发行版中的优化建议。
教程:反射API
反射的使用
对于需要检查和修改运行在Java虚拟机中应用的运行时状态的程序,常常使用反射。这是一个相对高级的特性,应该只由对该语言的基本原理有较强掌握的开发人员使用。因此,反射是一种功能强大的技术,可以使应用程序执行通常情况下不可能执行的操作。
可扩展特性
应用可以使用自定义的外部类,通过其全限定名就可以创建外部类的对象实例。
类浏览和可视化开发环境
类浏览可以枚举类的成员。可视化开发环境得益于通过反射来使用类信息让开发者能写出正确的代码。
调试器和测试工具
调试器可以查看类的私有成员变量。测试用例可以利用反射调用类上定义的可发现集API,以确保测试套件中的代码覆盖率。
反射的缺点
反射是强大的,但不应该被滥用。如果可以在不使用反射的情况下执行操作,最好避免使用反射。通过反射访问代码时,应该注意以下事项。
性能开销
反射涉及到动态解析类型,无法执行有些Java虚拟机优化。因此,反射操作比非反射操作性能更差,在性能敏感的场景中对于高频调用的代码部分应该避免使用反射。
安全限制
反射需要运行时权限,在安全管理器下运行可能不存在该权限。对于必须在受限制的安全上下文中(比如Applet)运行的代码,这是一个重要的考虑因素。
内部曝光
反射允许代码执行非反射代码中不合法的操作,比如访问私有字段和方法,使用反射可能会导致意想不到的副作用,这可能导致代码功能失常,并破坏可移植性。反射会破坏抽象,因此可能会随着平台的升级而改变行为。
该篇教程将演示使用反射来访问和操作类、成员、方法和构造器;包含代码示例、小贴士和常见故障排除。