问一个 Scala 元编程的问题

2019-11-06 17:33:00 +08:00
 scalaer

场景是想实现一个 dsl, 从 kafka 读取消息,sink 到 mysql。

现在遇到的问题是: 读取自定义的 schema, 转化成 scala 的 case class, 怎么获取它的类型?

以简化代码示例, 比较好解释:


import scala.reflect.runtime.universe._
import scala.tools.reflect.ToolBox

val cm = runtimeMirror(getClass.getClassLoader)
val toolBox = cm.mkToolBox()

toolBox.compile(q"""case class Foo(value:String) """)

// 如何获取 Foo 的类型, 因为下文需要将其传入序列化
// Deserializer[T]

val consumerSettings =
    ConsumerSettings(system, new StringDeserializer, new Deserializer[Foo])


在 scala 的REPl可以获取它的类型, 这是怎么实现的?

scala> toolBox.compile(q"""case class Foo(value:String) """)
res19: () => Any = scala.tools.reflect.ToolBoxFactory$ToolBoxImpl$ToolBoxGlobal$$Lambda$1471/913724364@5429565e

scala> new Foo("1")
res20: Foo = Foo(1)
1135 次点击
所在节点    问与答
6 条回复
scalaer
2019-11-06 17:45:20 +08:00
就是想实现在编译前获取 runtime 阶段的类, 求大佬指导下
shyling
2019-11-06 18:09:11 +08:00
没法获取。。。toolBox.compile(q"""case class Foo(value:String) """) 已经编译且运行了。。
你可以考虑下能不能编译时运行一遍插入代码,再继续编译。。
scalaer
2019-11-06 19:06:12 +08:00
@shyling 没有类似 “占位符" 的实现吗?
felixin
2019-11-07 11:19:28 +08:00
用 mao 存不就好了,为啥要用 case class ?
felixin
2019-11-07 11:20:10 +08:00
手误,map。反正都是手写字符串了也没什么类型安全可言了
felixin
2019-11-07 11:21:17 +08:00
或者你看一下 avro

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/616932

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX