Scala 2.11.7中的评估树

Scala 2.11.7中的评估树,scala,reflection,eval,Scala,Reflection,Eval,我试图在Scala中实现JSON-RPC服务器,并希望用注释标记我的远程方法。若方法本身不需要担心输入参数的验证,那个也很好,所以我想把这个验证放在注释中。我的结局是: class RPCMethod(validators: (String, PartialFunction[Any, Boolean])*) extends StaticAnnotation 远程方法的注释如下: @RPCMethod( "name" -> { case x: String =>

我试图在Scala中实现JSON-RPC服务器,并希望用注释标记我的远程方法。若方法本身不需要担心输入参数的验证,那个也很好,所以我想把这个验证放在注释中。我的结局是:

class RPCMethod(validators: (String, PartialFunction[Any, Boolean])*) extends StaticAnnotation
远程方法的注释如下:

@RPCMethod(
    "name" -> {
        case x: String => x == "Andrey"
    }
)
现在我试图提取{case…}部分,并将其求值到一个函数以检查入站值。但我能从倒影中得到的只是一棵树:

val annotation = method.annotations.find(_.tree.tpe == typeOf[RPCMethod]).get
val validators = annotation.tree.children.tail
if (validators.isEmpty) {
    return true
} else {
    validators.head match {
        case q"scala.this.Predef.ArrowAssoc[$_](${name: String}).->[$_]($func)" => // Don't know how to eval 'func'
        case _ => throw some error
    }
}

那么,如何从该树中获取有效的函数对象呢?

在将scala编译器添加到依赖项之后,似乎可以使用
mirror.mkToolBox().eval(func)
实现这一点,但现在我遇到了另一个问题。我需要RPC服务类的实际类型来反映其方法。但当我尝试运行这段代码时:
mirror.staticClass(x.getClass.getCanonicalName).selfType
其中x是类的对象,带有带注释的方法和验证,我得到一个错误:
java.lang.ClassCastException:scala.reflect.runtime.SynchronizedSymbols$SynchronizedSymbol$$anon$1不能强制转换为scala.reflect.internal.Names$Name
,如果我将PartialFunction更改为Function1:
@RPCMethod(“Name”->(x:Any=>x==“Andrey”))
我收到错误:
工具箱错误:反射工具箱失败:无法对已键入的树进行操作
:(