解释 - 不涉及反射

2024-03-07

我有一个非常简单的问题。这不仅适用于 Spray-json,而且我读过 argonaut 和 circe 的类似声明。所以请赐教。

在 Spray-json 中,我遇到这样的声明:There is no reflection involved。我理解基于类型类的方法,如果用户提供 JsonFormat 那么一切都很好。但是,当涉及到使用时,这种说法也成立吗?DefaultJsonProtocol?

因为当我们你看着this https://github.com/spray/spray-json/blob/f185c5fb1d53f5399dbbb7229d7f7ae02971be20/src/main/scala/spray/json/ProductFormats.scala#L67,你可以看到用法clazz.getMethods, clazz.getDeclaredFields等等,这不就是反射的用法吗?虽然当然要感谢object#apply我们不需要像 Java 世界中使用反射那样担心设置。但至少对于阅读字段名称,我不明白如何忽略反射。


我对spray-json不太熟悉,所以我不会捍卫它关于反射的主张,这似乎与ProductFormats你指着。

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

一般来说,当人们在 Java 或 Scala 上下文中谈论“反射”时,他们指的是运行时反射,但宏也支持一种反射,因此当我个人谈论派生在这些库中如何工作时,我会尽量小心地指定没有runtime涉及反思。

您可以认为编译时反射(或元编程,或任何您想称呼的名称)比运行时反射要好得多。它可能会使您的代码更加复杂,并且很容易被滥用,但它不会引入与运行时反射相同的脆弱性,并且不会削弱您以与运行时反射相同的方式推理代码的能力做。如果您了解宏的作用(这是一个很大的if),在运行时你永远不会感到惊讶。

类型从根本上讲是在运行之前拒绝潜在的不良程序,而运行时对类型的自省会使这一切变得混乱(如埃里克·奥海姆 说 https://twitter.com/d6/status/364821225131872257,“如果你在运行时遇到一个类型,杀死它”)。另一方面,编译时对类型的自省正是编译器所做的,宏只是为程序员提供了一种参与该过程的干净方式(或者至少相对干净,与编写编译器插件等相比)。 )。

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

这是一种非常冗长的方式,你应该在这种情况下将“不涉及反射”读作“不涉及运行时反射”(即使如此,我想你也不应该相信作者的话,鉴于这一切getMethodsSpray-json 中的内容)。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

解释 - 不涉及反射 的相关文章

随机推荐

  • 如何将自己的执行器传递给redis lettuce库?

    我有下面的代码来异步从 Redis 获取数据 默认情况下 lettuce 库中的 get 调用使用 nio event 线程池 Code 1 StatefulRedisConnection
  • 子视图没有接收到触摸

    我有主视图控制器 它添加了 2 个子视图 void viewDidLoad self init super viewDidLoad To shrink the view to fit below the status bar self wa
  • FFmpeg:将文件夹中的所有音频(mp3)批量转换为带有专辑封面的视频(mp4)

    我希望将文件夹中的所有音频 mp3 批量转换为带有专辑插图的视频 mp4 这用于将音频上传到 youtube 我几乎有一个工作代码 但我想自动化整个事情 这是我正在使用的 bat 文件中的代码 source FFMpeg 批量图像 多个音频
  • TF 对象检测 Zoo 模型没有可训练变量?

    中的模型TF 异议检测动物园 https github com tensorflow models blob master research object detection g3doc detection model zoo md有met
  • 如何在 Jetpack Compose 中将视图的基线与另一个视图的顶部对齐?

    我有一个卡片视图 我想将另一个视图 图中的红色视图 的中心与卡片的顶部对齐 如图所示 我该怎么做 卡的代码是这样的 class MainActivity ComponentActivity override fun onCreate sav
  • maven - 在构建时弹出请求许可的窗口

    我刚刚安装了 Maven 在构建 hello world 时 maven 不断向我请求许可 并显示以下消息 小程序正在尝试访问文件的 存在 状态属性 看起来这不是一个很常见的问题 有什么办法可以给maven授予这些权限吗 INFO Scan
  • Solr 中的 docValues 是什么?我什么时候应该使用它们?

    因此 我阅读了多个来源 试图解释 Solr 中的 docValues 是什么 但我似乎不明白何时应该使用它们 尤其是与索引字段和存储字段相关的时候 谁能解释一下吗 Solr 中的 docValues 是什么 Doc Values 可以解释为
  • 标题将包含的 div 从顶部向下推?

    我对 stackoverflow 和 Web 开发都是新手 尝试在没有任何帮助的情况下学习 我正在尝试创建一份简历 作为磨练我的技能的一部分 事情是这样的 我的包含 div 下的第一个 div 是带有 id 的 divheader 我已将包
  • Rails 中数字的本地化

    对新帖子感到抱歉 但我的第一个帖子关注的是阿拉伯 波斯数字 但问题似乎更大 我想知道是否有人做了一个 gem 来处理 ruby rails 中数字的本地化 I18n 官方语言环境 https github com svenfuchs rai
  • Pester:无法访问父作用域变量

    我在 Pester 中有以下简单的测试 Name Tests ps1 name foo Describe Check name It should have the correct value name Should Be foo 因此 当
  • R:解压缩多个文件,每个文件都在新的子目录中或重命名

    我设法调整一些代码来解压缩许多文件 但是解压时会出现同名文件 被替换 在我的工作目录中 我有 zip 文件 我在该目录中创建了一个名为 unzip 的新文件夹 我在其中解压缩了文件 dir create paste0 path unzip
  • 将 IEEE 754 浮点转换为 MIL-STD-1750A 浮点

    我正在尝试将 IEEE 754 32 位单精度浮点值 标准 c 浮点变量 转换为无符号长变量 格式为MIL STD 1750A http www xgc com manuals mil std 1750a 1 7 pdf 我在帖子底部包含了
  • 在 Grails 中将自定义 id 生成定义为默认值的最佳方法是什么?

    我想切换我的域类以使用可变长度的 UUID 作为其 id 我不想简单地在 URL 上显示连续的 id 供人们尝试和搞乱 我编写了一个自定义版本的 Java UUID 方法来允许可变长度 这样我就可以为不会变大的模型使用更短的 id 我发现这
  • 两个数组相加/求和

    我遇到了一个纯粹假设的问题 如果我找到正确的 linq 方法 感觉它有一个简单的解决方案 我有两个整数数组 我知道它们的大小相同 我想创建相同大小的第三个数组 其中第三个数组中的元素是相应位置的前两个数组中的元素之和 下面是一个应该显示我想
  • NetSuite / Suitescript - 为什么此验证字段脚本会进入无限循环?

    我的脚本进入无限循环 我不知道为什么 我在验证字段上运行此命令 并且如果存在具有相同参考号的另一个供应商帐单 则会阻止对该字段进行更改 从而强制用户将 参考号 更改为唯一 这是我的代码 function validateField type
  • 如何查看 C# 数组在内存中的分布情况?

    我想看看 C 数组是如何存放在计算机内存中的 我想看到的主要是两列 第一列是地址 第二列是数组元素 是否可以 我想从一维数组开始 但然后我想观察多维数组是如何放置的 Question 我如何通过 Visual Studio 看到它 您可以使
  • 运行时错误:事件循环正在运行

    当我调用该函数时出现以下错误send message Exception in thread Thread 1 Traceback most recent call last File usr lib python3 4 threading
  • Camel SFTP - 无法将目录更改为“/”

    我需要通过 SFTP 连接到服务器 但收到此错误 INFO org apache camel component file remote SftpOperations connect Connected to sftp myserver c
  • 从 Powershell 中的对象数组中删除项目

    我有一个数组对象 a 它返回如下所示的输出 通过执行 a 0 Name 我可以访问每个 Name 条目 a 0 Available 我可以访问其相应的可用空间 我有另一个数组 b 包含一些名称 例如 b 返回两个名称 sandeep agg
  • 解释 - 不涉及反射

    我有一个非常简单的问题 这不仅适用于 Spray json 而且我读过 argonaut 和 circe 的类似声明 所以请赐教 在 Spray json 中 我遇到这样的声明 There is no reflection involved