什么是反射,为什么有用?| Java Debug 笔记

本文正在参加「Java主题月 – Java Debug笔记活动」,详情查看活动链接

提问:什么是反射,为什么有用?

什么是反射,为什么有用?

我对Java特别感兴趣,但是我认为所有语言的原理都是相同的。

高分回答:

很多的知识点,真的需要写出来才会掌握!!! \color{purple}很多的知识点,真的需要写出来才会掌握!!!{~}

名称反射用于描述能够检查同一系统(或本身)中的其他代码的代码。

例如,假设您在Java中有一个未知类型的对象,并且您想在该对象上调用“ doSomething”方法(如果存在)。除非对象符合已知的接口,否则Java的静态类型化系统并不是真正为支持该类型而设计的,但是使用反射,您的代码可以查看该对象并确定其是否具有名为“ doSomething”的方法,然后在需要时调用该方法。想要。

因此,给您一个用Java编写的代码示例(假设有问题的对象是foo):

Method method = foo.getClass().getMethod("doSomething", null);
method.invoke(foo, null);
复制代码

Java中一种非常常见的用例是带注释的用法。例如,JUnit 4将使用反射来遍历类,以查找带有@Test批注的方法,然后在运行单元测试时调用它们。

有一些不错的反思示例,可帮助您入门:docs.oracle.com/javase/tuto…

最后,是的,在其他支持反射的静态类型语言(如C#)中,这些概念非常相似。在动态类型的语言中,上述用例不是必需的(因为编译器将允许在任何对象上调用任何方法,如果该方法不存在,则在运行时失败),但是第二种情况是查找标记或以某种方式工作仍然很普遍。

来自评论的更新:

检查系统中的代码并查看对象类型的能力不是反射,而是类型自省。然后,反射就是利用自省功能在运行时进行修改的能力。此处的区别是必要的,因为某些语言支持自省,但不支持反射。这样的例子就是C ++

高分回答:

例如,Java中的所有对象都具有方法getClass(),即使您在编译时不知道该对象的类,也可以使您确定该对象的类(例如,如果您将其声明为Object),这似乎很简单,但是这种反射是不可能的用不太活跃的语言(如C++。更高级的用法使您可以列出和调用方法,构造函数等。

反射很重要,因为它使您可以编写在编译时不必“了解”所有程序的程序,从而使它们更具动态性,因为它们可以在运行时绑定在一起。可以针对已知的接口编写代码,但是可以使用配置文件中的反射实例化要使用的实际类。

正因为如此,许多现代框架都广泛使用反射。大多数其他现代语言也都使用反射,在脚本语言(例如Python)中,它们甚至更加紧密地集成在一起,因为在这些语言的通用编程模型中感觉更为自然。

文章翻译自 am2dgbqfb6mk75jcyanzabc67y-ac4c6men2g7xr2a-stackoverflow-com.translate.goog/questions/3…

作者建议:很多源码都有涉及到反射的

真心感谢帅逼靓女们能看到这里,如果这个文章写得还不错,觉得有点东西的话

求点赞? 求关注❤️ 求分享? 对8块腹肌的我来说真的 非常有用!!!

如果本篇博客有任何错误,请批评指教,不胜感激 !❤️❤️❤️❤️

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享