Trail:反射 API

反射的用途

反射通常由需要检查或修改 Java 虚拟机中运行的应用程序的运行时行为的程序使用。这是一个相对高级的功能,只应由对语言基础有很深了解的开发人员使用。考虑到这一警告,反射是一种强大的技术,可以使应用程序执行原本不可能的操作。

  • Extensibility Features

    • 应用程序可以通过使用其完全限定的名称创建可扩展性对象的实例来使用外部用户定义的类。
  • 类浏览器和可视化开发环境

    • 一个类浏览器需要能够枚举类的成员。可视化开发环境可以受益于利用反射中可用的类型信息来帮助开发人员编写正确的代码。
  • 调试器和测试工具

    • 调试器需要能够检查类的私有成员。测试工具可以利用反射来系统地调用在类上定义的可发现的集合 API,以确保测试套件中的代码覆盖率很高。

反思的缺点

反射功能强大,但不应任意使用。如果可以在不使用反射的情况下执行操作,那么最好避免使用它。通过反射访问代码时,应牢记以下注意事项。

  • Performance Overhead

    • 由于反射涉及动态解析的类型,因此无法执行某些 Java 虚拟机优化。因此,反射操作的性能比非反射操作慢,因此应避免在对性能敏感的应用程序中经常调用的代码段中。
  • Security Restrictions

    • 反射需要运行时许可,而在安全 管理 器下运行时可能不存在。对于必须在受限的安全上下文(例如 Applet)中运行的代码,这是一个重要的考虑因素。
  • 内部暴露

    • 由于反射允许代码执行在非反射代码中是非法的操作,例如访问private字段和方法,因此使用反射可能会导致意外的副作用,这可能会使代码无法正常工作并可能破坏可移植性。反射性代码破坏了抽象,因此可能会随着平台的升级而改变行为。

Trail Lessons

本教程介绍了反射在访问和操作类,字段,方法和构造函数方面的常见用法。每节课均包含代码示例,技巧和故障排除信息。

  • Classes

    • 本类显示了获取Class对象并将其用于检查类的属性的各种方法,包括其声明和内容。
  • Members

    • 本课描述如何使用反射 API 查找类的字段,方法和构造函数。提供了用于设置和获取字段值,调用方法以及使用特定构造函数创建对象的新实例的示例。
  • 数组和枚举类型

    • 本课介绍了两种特殊类型的类:在运行时生成的数组和定义唯一命名对象实例的enum类型。示例代码显示如何检索数组的组件类型以及如何设置和获取具有数组或enum类型的字段。

Note:

本教程中的示例旨在用于try使用反射 API。因此,异常的处理与生产代码中使用的处理不同。特别是,在生产代码中,不建议转储用户可见的堆栈跟踪。