问题标签 [scala-reflect]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
scala - 在运行时从 scala 中的案例类对象中检索字段名和值
示例案例类:正在尝试创建通用查询构建器
我们如何在 scala 中检索字段名称和相应的值,
在进一步研究中,
使用 Scala 反射的解决方案:
另一种解决方案,
尝试去:
scala - 使用 Scala 反射检查对象上的方法或查找 Map 上的键类型
我正在将一个类从 Ruby 移植到 Scala 2.11,它实现了消息中的变量合并。我想将一个对象数组传递给 merge 方法,并让它在每个对象中搜索消息文本中引用的键。
其核心是一个名为lookUp(key: String, obj: AnyRef) 的方法,它接收要搜索的单个键,以及要搜索该键的单个对象。如果对象是一个 Map,并且 Map 的键是 Symbol 或 String,那么它将在 Map 中查找请求的键。否则,它将检查对象是否具有与键名相同的方法,如果有,它将调用该方法。
在现有的 Ruby 代码中,很容易做到这一点:
由于这样做很容易,Ruby 代码还会查找同名的实例变量。我的 Scala 版本不一定需要该功能。
我遇到的问题之一是我发现的示例要求我提前知道对象的类,以便我可以调用ru.typeOf[MyClass].declaration(ru.TermName("key"))
(where ru
is scala.reflect.runtime.universe
)。
另一个问题是,这种消息合并可能每分钟发生数百次,并且反射似乎是一个缓慢而复杂的过程。如果这一切都按计划进行,我可能会按对象类型缓存反射结果。
更新:我正在考虑这样的事情,但这是否矫枉过正?或者是否有必要正确捕获 Map 中的类型?此外,这不会编译。Map
,Symbol
并且String
不是适合其上下文的类型。
更新 2:我从来没有想过我可以使用asInstanceOf
类似Map[String, _]
. 我使用@johny 的第二个代码示例来提出我的解决方案。我将方法名称按类缓存在mutable.HashMap[Class[_], Set[String]]
.
scala - 通过它们的 apply 方法和 scala 反射实例化 scala 集合
我有一个工具试图构建各种 scala 集合的子类实例,例如scala.collection.Seq
. 我事先不知道具体应该建什么类,所以我尝试使用反射来获取apply
伴生对象中的方法如下(类似于声明List[Int](1, 2, 3)
)。
尽管如此,我得到了以下异常。我无法弄清楚我应该将什么传递给该apply
方法。
感谢您提前提供的任何帮助。
scala - 如何在scala中使用反射实例化泛型类
我有一个以这些特征开头的类层次结构:
我需要自动构建所有直接子类的列表MessageKey
。通过到处搜索,我想到了这一点:
这段代码给了我 type 的对象MessageKey[Nothing]
。正如你在上面看到的,我不知何故得到了Type
每个键的,但我不知道如何使用它。
我想做类似的事情
但是,当然,我不能aType
像那样使用那里。任何帮助表示赞赏。
scala - 获取密封特征的子类
是否有可能(通过宏、某种形式的 Shapeless automagic 或其他方式)获得密封特征的子类列表:
- 在编译时?
- 在运行时?
scala - Scala如何获取带注释的类
在 Java 中,我可以org.reflections
用于扫描包和搜索带注释的类。
像这样:
如何在scala中获得带注释的类?我使用scala 2.11
和scala-reflect
。
PSorg.reflections
在scala中效果很好,但我搜索原生乐器。
scala - Scala:为案例类动态生成匹配子句
我想在一组“条件动作”规则中使用 Scala 模式匹配的强大功能。这些规则不是事先知道的,而是根据一些复杂的标准在运行时生成的。算法生成机制可以被认为是完全独立的,不是这个问题的一部分,它涉及如何通过 Scala 反射/准引用来表达这一点。
具体来说,我希望case v0@x(v1,_,v2): X => f(v1,v2)
在运行时生成(一般形式的)案例定义。
toolBox.parse(str)
对于在运行时生成的某些字符串,大概可以做到这一点。但是,如果可能的话,似乎需要包含比这更大程度的类型安全:
Term,Var(name: Char),Lit(value:Int),Group(a: Term,b: Term,c: Term)
更具体地说,我希望case defs 与Terms ( )的密封case 类层次结构相匹配。
例如,生成的案例 def 通常会返回一些无函数、部分或全部 v0、v1、v2:
我正在尝试按照此处给出的 case defs 的 quasiquotes 描述进行操作,但语法相当令人费解(并且 Scala 2.11 的 eclipse 拒绝向我显示类型),所以下面是我所得到的. 我的具体问题嵌入在代码中:
scala - 反思类型成员?
我知道这是可能的:
但是,现在我想做A
一个抽象类型:
如何实现该isDouble
功能?
scala - 如何使用 scala-reflect 找到父隐式参数?
我有两节课:
给定一个Symbol
对应于Y
的隐式构造函数参数,我想找到它对应的父类隐式参数的符号(如果存在的话)。
现在我需要过滤它以使其具有相同的类型(或超类型,但这对我的用例无关紧要)。我试过xParam.typeSignature =:= yOrdSym.typeSignature
了,没有用。这是有道理的,因为类型参数有不同的所有者。但是,xParam.typeSignature =:= yOrdSym.typeSignatureIn(xSym.toType)
也不xParam.typeSignatureIn(ySym.toType) =:= yOrdSym.typeSignature
行。如何正确执行?