场景是想实现一个 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)
1
scalaer OP 就是想实现在编译前获取 runtime 阶段的类, 求大佬指导下
|
2
shyling 2019-11-06 18:09:11 +08:00
没法获取。。。toolBox.compile(q"""case class Foo(value:String) """) 已经编译且运行了。。
你可以考虑下能不能编译时运行一遍插入代码,再继续编译。。 |
4
felixin 2019-11-07 11:19:28 +08:00 via Android
用 mao 存不就好了,为啥要用 case class ?
|
5
felixin 2019-11-07 11:20:10 +08:00 via Android
手误,map。反正都是手写字符串了也没什么类型安全可言了
|
6
felixin 2019-11-07 11:21:17 +08:00 via Android
或者你看一下 avro
|