首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >解释-不涉及反思

解释-不涉及反思
EN

Stack Overflow用户
提问于 2015-11-07 06:06:57
回答 1查看 918关注 0票数 11

我有一个很简单的问题。这不仅适用于喷雾-json,而且我也读过与阿戈纳特和切尔斯类似的说法。所以请指点我。

在“喷雾-json”中,我看到了这样一种说法:There is no reflection involved。我理解基于类型的方法,如果用户提供JsonFormat,那么一切都很好。但是,当涉及到使用DefaultJsonProtocol时,这一说法也是正确的吗?

因为当我们看时,您可以看到clazz.getMethodsclazz.getDeclaredFields等的用法。这不是反射的用法吗?当然,多亏了object#apply,我们不需要担心设置,不像在Java中使用反射。但至少在阅读字段名时,我不明白如何忽略反射。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-11-07 07:38:20

我不太熟悉喷雾-json,所以我不会为它关于反射的说法辩护,这显然与你所指的ProductFormats的部分不一致。

我确实更了解circe和Argonaut以及argonaut-shapeless并播放JSON,所有这些都使用某种反射来派生case类和其他用户定义类型的编解码器。重要的一点是,这些库不使用运行时反射--它们通过Scala的宏系统确定它们在编译时需要的字段名和其他信息。

通常,当人们在Java或Scala的上下文中谈论“反射”时,他们指的是运行时反射,但是宏也支持某种反射,所以当我亲自谈到这些库中的派生如何工作时,我会小心地指定不涉及运行时反射。

您可以争辩说,编译时反射(或者元编程,或者您想称之为它的任何东西)都比运行时反射差得多。它可能会使您的代码更加复杂,而且很容易被滥用,但它不会带来与运行时反射相同的脆弱性,也不会削弱您以与运行时反射相同的方式对代码进行推理的能力。如果您了解宏所做的事情(这是一个很大的假设),您将不会在运行时感到惊讶。

类型从根本上讲是在运行它们之前拒绝不良的潜在程序,而在运行时对类型的内省使这一切变得混乱(如埃里克·奥希姆说,“如果您在运行时遇到一个类型,请将其关闭”)。另一方面,编译时对类型的反省正是编译器所要做的,而宏只是给了程序员一种干净利落的方式来参与这个过程(或者至少相对干净,与编写编译器插件相比,等等)。

避免运行时反射对性能也有好处,但对我个人来说,这通常是次要的问题--我讨厌运行时反射,因为我浪费了太多的时间来调试可怕的Java代码,这些代码使用了严重依赖运行时反射的可怕Java库--而不是因为运行时反射可能会使我的程序稍微慢一些。

这是一种非常冗长的说法:在这种情况下,您应该阅读“不涉及反射”,就像“不涉及运行时反射”(我猜,即使这样,考虑到getMethods的所有内容,您也不应该相信作者的话)。

票数 18
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33579725

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档