Java反射 之 实际用法示例

反射是诸如多线程之类的事情之一,其中有经验的每个人都说“除非绝对必要,否则请不要使用它”。

以上报价对我们所有人来说都是绝对正确的。在上一教程中,我讨论了注解的基础知识,其中讨论了使用反射来读取类或方法上应用的注解的用法。这立即激起了我的强烈要求,提出了一些现实生活中“好”的反思示例以及开发人员需要它的可能方案。我答应对这个特定的主题提出自己的想法/想法,因此在本文中,我将讨论java中反射的相同示例,现实生活中的实际示例

反射用于不耐烦的示例

代码分析器工具
Eclipse自动完成方法名称的
编组
和解组Spring框架以创建bean 
通过ORM(如 Hibernate 实体
Junit Testcases)解析注解

什么时候需要反思?

超过几个专业程序员会回答“ 尽可能少,甚至永远不会”

说了一句话,让我进一步阐述。Java是具有OOP所有“良好”功能的强类型语言。在实践中,如果您知道要在应用程序中处理的类,则可能永远不会遇到需要反思的情况。“永不”。当您知道要使用的类时,您可以完成任何任务,满足任何要求,而无需进行反思。

但是,一旦您被告知要处理编写代码时不知道的类,则必须以过于笼统的方式编写代码,以便它可以处理任何类类型,然后您需要进行反射来完成工作。

例如,要求您编写一个代码分析器,它可以查看任何类的内部;并列出所有私有方法,那么您只能通过反射来做到这一点。通常,据说,每当您在编译时不知道应实例化的类型或应调用的方法时,都需要进行反射。

反思的几个真实例子

在讨论了现实生活中的应用程序编程中的反射需求之后,是时候列出一些使用反射来实现某些目标的实例了。

代码分析器工具

代码分析器工具对代码执行许多不同的操作。他们对语法进行静态分析,显示优化技巧,甚至报告错误情况,等等。编写它们的方式可以分析传递给他们进行分析的任何类文件。他们怎么做而又不用看课堂内部。显然,他们在此分析中使用了反思。

Eclipse(其他IDE)自动完成方法名称

曾经强调过您的想法,CTRL+SPACE即使您还没有完成编写该类的时间,Eclipse还是能够为您提供方法建议。反射就是这种魔力。

我曾在一个团队中工作,该团队开发了一个eclipse插件,用于为某些接口中定义的方法生成REST API源代码。它曾经为每个接口方法创建一个REST API,然后使用向导可以指定其他REST特定的东西,例如HTTP方法(GET,PUT,POST,DELETE),查询参数,路径参数和返回值。返回值是一个JAXB注解类,它也是由插件生成的。并且几乎90%的代码生成逻辑都是围绕反射编写的。

实际上,反射在此类IDE的插件中大量使用。无论是日食,还是IntelliJ或任何其他IDE。

编组和解组

JAXB / Jattison和其他编组/解组库在与Java bean代码之间的XML(或JSON)中大量使用反射。他们在Java bean中查找所有带注解的属性,分析其总体属性并为其生成XML标记。拆封同样有效。

用于创建bean的Spring框架

Spring框架使用依赖项注入(DI)将依赖项填充到配置文件中定义的bean中。DI框架实际上大量使用反射来注入这些bean依赖项。

从Spring 3开始,您还可以使用注解通过autowiring定义依赖项。仅使用反射来分析注解以进行依赖项注入。

通过ORM解析注解,例如 Hibernate 实体

hibernate之类的ORM 使用配置文件(而不是使用注解)来定义实体之间的关系以及实体和数据库架构之间的关系。所有这些信息都使用java反射功能进行处理。

Junit测试用例

如果您还记得以前的Junit版本,那么要运行一个测试用例,您要让cad进行的所有操作都命名为一个以test开头的方法,例如testMethod1(),testCode2()等。Junit处理器正在使用反射来迭代类中的所有方法,和以test开头的查找方法,并将其作为测试用例运行。

在更高版本中,以test开头的命名约定已被注解的用法所代替,但反射的用法则更为相似。

摘要

我在某处读过这句话:

“当您需要反思时;你会知道的。”

因此,我对所有亲爱的朋友的建议是,只学习基础知识,不要在学习高级概念上投入过多的精力。您可以在需要它们时随时学习它们,而且很少有机会获得应用这些知识的机会。

这就是本主题的全部内容。我很高兴听到您的想法。

学习愉快!

saigon has written 1440 articles

Leave a Reply