想象一下,我有一个注释案例类的宏注释:
class message(`type`: String) extends StaticAnnotation {
def macroTransform(annottees: Any*) = macro message.impl
}
...
@message("SearchReq")
case class SearchReq(req: String)
我有另一个包中的MessageRegister对象。在注释@message body message.impl
中,我需要在寄存器中添加消息类型。
我不知道该怎么做。首先想到的是获取MessageRegister对象的树并将代码添加到其在运行时执行的主体中。下一个想法是@message注释在运行时执行,我只是执行MessageRegister.registerMessage(msg)。
我该如何解决这个问题?
答案 0 :(得分:0)
宏目前无法修改其范围之外的任何内容。我的意思是,它是可能的,但它:1)需要深入了解编译器内部,2)很可能在编译器的次要版本中不兼容,3)很可能不能稳健地工作(因为它会使关于编译顺序的假设。)
说到调用MessageRegister.registerMessage(msg)
,你可以创建一个宏注释,生成这段代码是SearchReq
的伴随对象。但是,该代码没有保证执行的时间(因为只有在有人触发SearchReq
对象的构造函数时才会调用它),这意味着它不会很健壮(再次,关于执行顺序的假设。)