【问题标题】:Is reflection actually useful apart from reverse engineering?除了逆向工程,反射真的有用吗?
【发布时间】:2011-11-04 23:46:26
【问题描述】:

Java 和 PHP 等语言支持反射,它允许对象提供有关自身的元数据。是否有任何合法的用例,您需要能够做一些事情,例如询问对象它在逆向工程领域之外有哪些方法?这些用例中的任何一个在今天实际实施了吗?

【问题讨论】:

  • ...这只是 SO 自动列出的“相关”问题中的第一个。我很难相信在您撰写此问题时,系统会自动向您推荐没有任何有用的

标签: reflection


【解决方案1】:

反射在 Java 中被广泛使用,框架在运行时利用这些框架动态地操作其他代码。如果没有反射,代码之间的所有链接都必须在编译时完成(静态)。

因此,例如,任何有用的插件框架(OSGi、JSPF、JPF)都利用了反射。任何注入框架(Spring、Guice 等)都利用反射。

任何时候您想编写一段代码来与另一段代码交互在编译时该段代码不可用,反射是 Java 的前进方向。

但是,这最好留给框架,应该被封装。

【讨论】:

  • 另一种方法是使用 GCLIB 和动态代码生成
【解决方案2】:

当然有很好的用例。例如,获取开发者提供的元数据。 Java API 越来越多地使用注释来提供有关方法/字段/类及其使用的信息。就像输入验证,绑定到数据表示......您可以在编译时使用这些来生成元数据描述符并使用它们,但是在运行时执行它需要反射。即使您使用元数据描述符,它们最终也会包含需要通过反射访问的类、方法和字段名称等内容。

另一个用例:动态语言。以 Ruby 为例...它允许您在尝试调用该方法之前预先检查对象是否会响应方法名称。这样的事情需要反思。

或者什么时候必须从外部编译代码提供类或方法名称,例如选择某个 API 的实现时。这只是一小段文字。查找它所解决的问题归结为反思。

【讨论】:

    【解决方案3】:

    Spring 或 Hibernate 等框架广泛使用反射来检查类并查看注释。

    【讨论】:

    • @ZachRattner 注释是代码中放置在类声明、方法等各种元素之前的一些元数据。注释本身不做任何事情,但可以被工具用于各种目的,例如生成额外的人工制品或检查约束。一方面,这是元信息,您不想在自己的类中硬编码行为。另一方面,在单独的文件中提供此类信息会使它远离它所属的位置:使用代码。输入注释,以弥合差距。有关代码代码的信息。
    【解决方案4】:

    用于调试、序列化、日志记录、测试的框架...

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-04-09
      • 2010-12-15
      • 2019-08-16
      • 1970-01-01
      • 2012-02-15
      • 2012-08-26
      相关资源
      最近更新 更多