何时使用反射是一种很好的做法?

时间:2017-03-25 09:19:54

标签: java reflection

我最近在课程中学习了反射,并获得了使用Java中的反射从XML文件创建对象的任务。通过搜索这个网站,我注意到似乎有一个普遍的共识,即使用反射,特别是以这种方式,是一个坏主意。对我来说很奇怪,因为我们被告知这是我们将在本学期学到的最有用的东西之一。

我无法控制自己的任务,所以无论如何我都必须以这种方式完成它。但我想知道,何时使用反射是一种很好的做法?您可能会遇到哪些行业示例,其中反思是解决问题的最佳方式?

2 个答案:

答案 0 :(得分:4)

反射是一种工具,您应该在需要时使用它,在适当的地方使用其他工具。

何时适合使用反射?当您处理的对象或类的实例具有一些不被接口强制执行的常见行为时。

最简单的例子是POJO,你经常使用只是字段集合及其getter和setter的类,它们的行为方式相同,但你不能用继承来定义它们的常见行为。

有数百种工具利用这种行为从头开始构建pojos或设置字段,并使用反射。

示例:GSON,JAXB,Hibernate,Spring,Weld ......等。

反射更难编写,更难以调试和测试,给你相当可怕和无法提供信息的堆栈跟踪,但让你处理更常见的常见行为然后继承。

附注,因为引入注释反射变得不那么可怕了,因为你可以装饰类,其中的信息可以让你用更可靠的方法进行反思,实际上我引用的所有框架都使用了注释。

最后但并非最不重要的是,您并没有完全使用反射,因为您需要它来进行元编程,并且大部分时间都需要元编程其他人已经为你完成了(参见GSON,JAXB,Hibernate,Spring,Weld等),所以实际上你会发现很难找到一个通常足以用反射来解决的问题,并且还没有被解决其他

答案 1 :(得分:1)

Java在代码中内置了许多安全措施,例如编译时的静态类型检查,私有成员和最终成员。

虽然有时候这很好,但也很危险。通常,成员因某种原因被宣布为私有和/或最终成员。

所以,通常不鼓励反思,因为除非你真的需要,否则你不应该禁用安全装置。

你的作业很像JSON解析器(例如GSON,Jackson等)。他们使用反射从JSON创建动态对象。我几乎在我工作的每个项目中都使用JSON解析器,但我自己并没有写出几乎相同的反射。

所以最后你应该避免反思,除非需要这个功课会教你两个铃声。 1.在需要使用它时,反射如何工作。 2.更深入地了解您使用的工具(例如GSON)是如何工作的,这样您就可以了解香肠是如何制作的。

如果您正在学习计算机科学,那么您很可能会有一两个数据结构。虽然大多数项目你真的不应该建立你自己的LinkedList(Java几乎肯定更好,至少更好的测试)建立自己的教你如何制作香肠,这样你就知道什么时候遵守规则以及何时打破它们。