访问 Scala 中的注释值

2023-11-21

TL;DR:基本上,我正在寻找 Java 的 Scala 等价物:

(MyAnnotation) Thing.getClass().getAnnotations()[0]

尽管我可以很高兴地发现注释并根据其类型进行查询,但我似乎无法从scala.reflect.runtime.universe.Annotation变成我的实际类型。

scala> // Declare an annotation (it seems StaticAnnotation means runtime
scala> // retention)
scala> case class MyAnnotation(x: Int, y: String) extends scala.annotation.StaticAnnotation
defined class MyAnnotation

scala> // Make a thing decorated with MyAnnotation
scala> @MyAnnotation(x=5, y="cool") case class Thing()
defined class Thing

scala> // Look at the annotation on the Thing...the runtime clearly
scala> // understands the values on it
scala> val annotation = scala.reflect.runtime.universe.typeOf[Thing].typeSymbol.asClass.annotations(0)
annotation: reflect.runtime.universe.Annotation = MyAnnotation(5, "cool")

scala> // I can sort of get at the values by index, which isn't terribly
scala> // safe
scala> annotation.scalaArgs(0)
res0: reflect.runtime.universe.Tree = 5

scala> // And what is a Tree here anyway? It certainly isn't a String (or
scala> // Int). I just want the value!
scala> annotation.scalaArgs(1)
res1: reflect.runtime.universe.Tree = "cool"

scala> // But how do I get at those values programatically?
scala> annotation.asInstanceOf[MyAnnotation]
java.lang.ClassCastException: scala.reflect.internal.AnnotationInfos$CompleteAnnotationInfo cannot be cast to MyAnnotation
        at .<init>(<console>:13)
        at .<clinit>(<console>)
        at .<init>(<console>:7)
        at .<clinit>(<console>)
        at $print(<console>)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.lang.reflect.Method.invoke(Method.java:606)
        at scala.tools.nsc.interpreter.IMain$ReadEvalPrint.call(IMain.scala:734)
        at scala.tools.nsc.interpreter.IMain$Request.loadAndRun(IMain.scala:983)
        at scala.tools.nsc.interpreter.IMain.loadAndRunReq$1(IMain.scala:573)
        at scala.tools.nsc.interpreter.IMain.interpret(IMain.scala:604)
        at scala.tools.nsc.interpreter.IMain.interpret(IMain.scala:568)
        at scala.tools.nsc.interpreter.ILoop.reallyInterpret$1(ILoop.scala:760)
        at scala.tools.nsc.interpreter.ILoop.interpretStartingWith(ILoop.scala:805)
        at scala.tools.nsc.interpreter.ILoop.command(ILoop.scala:717)
        at scala.tools.nsc.interpreter.ILoop.processLine$1(ILoop.scala:581)
        at scala.tools.nsc.interpreter.ILoop.innerLoop$1(ILoop.scala:588)
        at scala.tools.nsc.interpreter.ILoop.loop(ILoop.scala:591)
        at scala.tools.nsc.interpreter.ILoop$$anonfun$process$1.apply$mcZ$sp(ILoop.scala:882)
        at scala.tools.nsc.interpreter.ILoop$$anonfun$process$1.apply(ILoop.scala:837)
        at scala.tools.nsc.interpreter.ILoop$$anonfun$process$1.apply(ILoop.scala:837)
        at scala.tools.nsc.util.ScalaClassLoader$.savingContextLoader(ScalaClassLoader.scala:135)
        at scala.tools.nsc.interpreter.ILoop.process(ILoop.scala:837)
        at scala.tools.nsc.MainGenericRunner.runTarget$1(MainGenericRunner.scala:83)
        at scala.tools.nsc.MainGenericRunner.process(MainGenericRunner.scala:96)
        at scala.tools.nsc.MainGenericRunner$.main(MainGenericRunner.scala:105)
        at scala.tools.nsc.MainGenericRunner.main(MainGenericRunner.scala)

关于这一切的令人高兴的部分是,即使我愿意,我什至无法使用传统的 Java 方法,因为 Scala 不费心从以下位置填充数组:getAnnotations()不再了。

scala> Thing.getClass.getAnnotations.length
res2: Int = 0

Related

我想我想要的是《反思概述》在“在运行时实例化类型”部分中,但我不明白为什么我必须跳过这么多的环节才能获取注释中的值。在 Java 中,该值只是被丢弃。

问题“请参阅 Scala 反射中的注释”似乎相关,但问题来自 2011 年并且适用于 Scala 2.9。我正在使用 2.10,据我所知,从那时起,反射的工作方式发生了很大的变化。


在目前的形式中,Scala 注释尝试将 Java 兼容性(这意味着注释中仅允许常量参数和非常有限数量的语言构造)和最终灵活性(这意味着允许注释中允许任何人们想象的内容)结合起来。

这通过 ClassfileAnnotation(兼容性)与 StaticAnnotation(灵活性)的区别来体现。根据这一想法,我们可以在 Java 风格的反射和 Scala 风格的反射之间进行选择,前者的注释有限,可用作对象;后者的完全灵活的注释仅作为抽象语法树使用(请注意,我们无法自动将静态注释转换为运行时对象) ,因为存储在此类注释中的代码可能包含任意 Scala 表达式,这使得评估它们变得非常困难)。

不幸的是,这种理想主义的景象被类文件注释不支持运行时保留这一事实所打破:https://issues.scala-lang.org/browse/SI-32,这意味着实际上无法进行选择 - 目前仅支持 Scala 风格的反射。希望有一天我们能修复 SI-32,但我不知道有任何持续的努力让它发挥作用。

几个月前,我想实现类似的东西scala.reflect.Annotation.eval如果可能的话,它将采用 Scala 风格的注释并对其进行评估。然而,经过一次反射会议的讨论后,我们决定不这样做,因为除了不幸的非通用性之外,这个 API 还会给编译时反射带来麻烦(在 Scala 中与运行时反射统一)。

这已被记录为问题https://issues.scala-lang.org/browse/SI-6423并还在讨论过https://groups.google.com/forum/#!topic/scala-internals/8v2UL-LR9yY,但目前没有具体的改进计划。希望 Palladium 项目能够在这里提供帮助,因为它的核心组件之一是 Scala 解释器,它将提供必要的通用性来支持Annotation.eval.

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

访问 Scala 中的注释值 的相关文章

  • 为什么我的 Project Euler Problem 12 算法这么慢?

    我已经在 Scala 中为 PE P12 创建了解决方案 但速度非常非常慢 有人可以告诉我为什么吗 如何优化这个 calculateDevisors 简单的方法和calculateNumberOfDivisors 除数函数具有相同的速度 i
  • Play框架2:如何在路由、视图和控制器之间传递对象?

    我正在尝试将书籍对象从视图传递到路线 然后将其发送到控制器中进行计算 我的代码如下 bookList scala html books java lang Iterable Book main BookList div class row
  • Scala 组合器解析器 - 区分数字字符串和变量字符串

    我正在做 Cay Horstmann 的组合器解析器练习 我想知道区分代表数字的字符串和代表匹配语句中变量的字符串的最佳方法 def factor Parser ExprTree wholeNumber expr ident case a
  • IntelliJ IDEA Scala 插件问题

    我对新的 Intellij IDEA 10 和 Scala 插件有疑问 当我在 Scala 源文件中输入任何内容时 编辑器会永久冻结 在其他文件 java 和其他 编辑器中效果很好 结构视图 scala 检查和显示成员功能已关闭 堆大小增加
  • 如何检查字符串中是否包含某个字符?

    我想检查字符串是否包含该字符 我正在编写一个刽子手代码 例如 下面是要猜测的单词 scala 但看起来像 至用户 假设用户输入字母 a 那么它一定看起来像 a a def checkGuess if result contains user
  • 获取类的所有方法(包括 Java 8 继承的默认方法)的新方法是什么?

    我想获取一个类的所有方法 包括公共方法 受保护方法 包方法和私有方法 还包括继承的方法 记住 Class getDeclaredMethods 公开 受保护 打包和私有 方法 but排除继承的方法 Class getMethods获取继承的
  • 如何使用 apply/unapply 方法重现案例类行为?

    我尝试用普通类和伴生对象替换案例类 但突然出现类型错误 编译良好的代码 综合示例 trait Elem A B def C other Elem C A Elem C B other match case Chain head tail g
  • 将 Scala 库转换为 DLL (.NET)

    我正在尝试从 scala 类创建一个 Dll 我将 IntelliJ 与 SBT 一起使用 我已经找到了一种使用 ikvm converter 将 jar 文件转换为 Dll 的方法 现在的问题是 当我在 SBT 下使用 package 从
  • Scala:具有复杂结构的树插入尾递归

    我正在 scala 中创建自定义对象树 并且我的插入方法引发堆栈溢出 因为它不是尾递归 但是 我不太清楚如何使其尾递归 我见过使用 累加器 变量的相关示例 但它们要么是只能相乘和覆盖的整数之类的东西 要么是我在适应树时遇到困难的列表 这是我
  • 了解 Scala 中的中缀方法调用和缺点运算符(::)

    我对 Scala 编程语言相当陌生 当我遵循以下网站的讲义时 我正在尝试一些萦绕在我脑海中的东西 here http horstmann com sjsu cs152 04 closures1 html 我想我无法真正理解 cons 运算符
  • 将 python 'type' 对象转换为字符串

    我想知道如何使用 python 的反射功能将 python 类型 对象转换为字符串 例如 我想打印一个对象的类型 print My type is type some object which obviously doesn t work
  • Scala 相当于 Java 的 Number

    我正在尝试为数值域类型构建类型层次结构 例如AYear is an Int 这是一个Number a Percentage is a Double 这是一个Number等等 我需要层次结构以便我可以调用toInt or toDouble关于
  • 如何捕获 Oozie Spark 输出

    有没有办法捕获spark的输出然后将其输入到shell上 我们当前正在使用 scala 创建 jar 文件 并希望我们的 Spark 输出成为 shell 输入 我的想法是使用 wf actionData spark XXXX var 我只
  • 获取类 DisplayName 属性值

    我花了最后一个小时试图获得 a 的价值DisplayName应用于 a 的属性Class 我发现从方法和属性中获取属性值很简单 但我在该类上遇到了困难 有人可以帮我解决这个相对较小的问题吗 示例如下 班上 DisplayName Oppor
  • 如何在 Scala 中打印任何内容的列表?

    目前我有一个打印整数的方法 def printList args List Int Unit args foreach println 我如何修改它 使其足够灵活 可以打印任何内容的列表 您不需要专用的方法 所需的功能已经在集合类中 pri
  • 使用 Spark DataFrame 获取组后所有组的 TopN

    我有一个 Spark SQL DataFrame user1 item1 rating1 user1 item2 rating2 user1 item3 rating3 user2 item1 rating4 如何按用户分组然后返回TopN
  • 为什么《Scala 中的函数式编程》一书的“无异常处理错误”一章中没有提到“scala.util.Try”?

    在 Scala 中的函数式编程 一书中的 无异常处理错误 一章中 作者给出 从函数体抛出异常的问题 Use Option如果我们不关心实际的异常 Use Either如果我们关心实际的异常 But scala util Try没有提到 从我
  • 错误:协变类型 A 出现在逆变位置

    我试图写一个不可变的Matrix A 班级 我希望该类是协变的A但是当我把 在 前面A编译器开始抱怨类中的某些操作 以下是我的相关子集Matrix类 实际类比以下子集大 5 倍左右 class Matrix A private val co
  • 对 Scala Not Null 特征的库支持

    Notice 从 Scala 2 11 开始 NotNull已弃用 据我了解 如果您希望引用类型不可为空 则必须混合魔法NotNull特征 编译器会自动阻止你输入null 可以值在里面 看到这个邮件列表线程 http www nabble
  • Scala 中的 Shapeless 结构编程:如何正确使用 SYB 实现?

    我想使用SYB http research microsoft com en us um people simonpj papers hmap 实施于无形图书馆 https github com milessabin shapeless编写

随机推荐

  • 如何获取ng-bootstrap中Dropdown的值?

    我正在使用 ng bootstrap 我想在选择时获取下拉列表的值 div class col text right div class d inline block div div
  • 如何从部分视图获取父视图

    我有一个部分视图作为 Layout cshtml 的一部分 以便它可以在多个页面上呈现 将部分视图视为显示在网站每个页面上的菜单 当单击部分视图菜单中的这些链接之一时 我只能在称为部分视图的操作方法中访问 查看 如它的名称等 但我真正需要的
  • 无法更改视图的默认布局边距

    从ios 8 0开始 视图有额外的layoutMargins默认情况下 每边都有 8 分值 当我尝试更改边距时viewDidLoad它似乎对孩子的看法没有影响 override func viewDidLoad super viewDidL
  • Python lambda函数打印 at 0x7fcbbc740668>而不是值

    我是 python 的初学者 我正在研究 lambda 函数 我正在编写一个程序 使用 lambda 函数来打印输入字符的 ascii 值 1 的字符 我的代码是 usr bin python import sys try word sys
  • NoClassDefFoundError:org/slf4j/Logger

    我将 Log4J2 添加到我的应用程序中 我将所有 Log4J2 jar 文件复制到 LIB 目录并创建 Log4J2 xml 文件来支持它 我的代码已更新以导入必要的日志管理器和记录器 API 然后 我添加了静态最终记录器方法 并在代码中
  • 什么时候可以捕获 NullPointerException?

    有效的java建议我们不应该catch NullPointerException 总是对的吗 在很多抓捕的情况下NullPointerException 仅捕获正文调用printStackTrace 如果我没抓住NullPointerExc
  • Azure管道根据条件设置任务的显示名称

    在构建管道中 我有一个使用 powershell 脚本的工作 该脚本根据如下变量设置应用程序名称 applicationName If configuration eq Release Appname Else Appname Test W
  • Plotly:如何设置 x 轴上时间序列的主要刻度/网格线的值?

    背景 这个问题与以下问题相关 但不完全相同 Plotly 如何检索主要刻度线和网格线的值 类似的问题也被问过但没有得到解答绘图库 here 如何将主要刻度显示为每月的第一天 将次要刻度显示为每天 情节太棒了 也许唯一困扰我的是刻度线 网格线
  • Android 上的 Scala:java.lang.NoSuchMethodError:java.lang.String.isEmpty

    我在 Android 2 2 1 上遇到以下异常 java lang NoSuchMethodError java lang String isEmpty 我正在打电话text isEmpty来自斯卡拉 任何想法 如何解决这个问题 java
  • HashicorpVault - 客户端向 HTTPS 服务器发送 HTTP 请求 - 准备探针

    目前存在一个问题 即部署 Vault Helm 图表时就绪探针失败 Vault 正在工作 但每当我描述 Pod 时都会出现此错误 我如何让探测器使用 HTTPS 而不是 HTTP 如果有人知道如何解决这个问题我会很高兴慢慢失去理智 Kube
  • 同时使用多个Spring PropertyPlaceholderConfigurer

    我有两个项目 其中一个 服务 包括第二个 核心 我在核心项目中定义了下面的 PropertyPlaceholderConfigurer
  • 为什么 C 语言中移位的优先级低于加法和减法?

    我有时在进行位操作时发现这很不方便 尽管我现在不记得任何具体的例子 我还发现它在概念上令人困惑 因为移位基本上是乘法和除以 2 的幂 我发现在 C 中使用 因为这就是 C 语言的作者所决定的 使用括号以避免混淆
  • 如何将 Android 意图传递给除了我自己的应用程序之外的任何人?

    我有一个特定的意图 NDEF DISCOVERED 其中一些我无法正确处理 所以我想将它们重定向到 android 的默认 nfc 处理程序 所以我采取了意图 setComponent null 进而startActivity intent
  • 从 ASP.Net 页面运行批处理文件

    我试图通过 ASP Net 页面在服务器上运行批处理文件 这让我抓狂 当我运行下面的代码时 没有任何反应 我可以从一些日志语句中看到该代码运行 但我传递给该函数的 bat 文件从未运行 有人可以告诉我我做错了什么吗 public void
  • jQuery 无法在 AJAX 加载页面中工作

    我正在使用 jQuery 使用 ajax 假设 test html 通过 AJAX 加载页面 它是一个简单的 HTML 文档 带有一些按钮和单击它们时关联的动画 也使用 jQuery 当我直接加载页面时 关联的 click 属性工作正常 但
  • 用纯JS动画最大高度?

    我想要为 div 的高度设置动画 这通常在 CSS 中通过动画来完成max height财产 但是我需要在 JS 中执行此操作 div 填充了经常变化的动态内容 因此无法提前知道实际高度 这是一个jsfiddle https jsfiddl
  • 神经网络如何使用遗传算法和反向传播来玩游戏?

    我碰到YouTube 上这段关于遗传算法的有趣视频 正如您在视频中看到的 机器人学会了战斗 现在 我已经研究神经网络一段时间了 我想开始学习遗传算法 这在某种程度上将两者结合起来 如何结合遗传算法和神经网络来做到这一点 在这种情况下 人们如
  • Web API 和 ValidateAntiForgeryToken

    我们有一些现有的 MVC Web 服务 它们在网页中称为 AJAX 样式 这些服务利用 ValidateAntiForgeryToken 属性来帮助防止请求伪造 我们正在寻求将这些服务迁移到 Web API 但似乎没有等效的防伪功能 我错过
  • 注释会影响 Perl 性能吗?

    我正在优化一些经常运行的 Perl 代码 每个文件每天一次 注释会减慢 Perl 脚本的速度吗 我的实验倾向于不 use Benchmark timethese 20000000 comments gt b 1 comment 100 ti
  • 访问 Scala 中的注释值

    TL DR 基本上 我正在寻找 Java 的 Scala 等价物 MyAnnotation Thing getClass getAnnotations 0 尽管我可以很高兴地发现注释并根据其类型进行查询 但我似乎无法从scala refle