Scala 使用反射从注释调用方法

Scala 使用反射从注释调用方法,scala,reflection,scala-reflect,Scala,Reflection,Scala Reflect,我有Sample类和Size注释 案例类示例( 属性:某种类型 @大小(值=50) 姓名:SomeTypeB) 此Size注释是一个实现AnnotationInterface trait注释接口[T]{ def getValue:T } 类大小(值:Int)使用AnnotationInterface[Int]扩展StaticAnnotation{ 覆盖def getValue:Int=value } 我有提取器,它负责使用反射提取类成员 类提取器[A](隐式 tt:TypeTag[A], c

我有
Sample
类和
Size
注释

案例类示例(
属性:某种类型
@大小(值=50)
姓名:SomeTypeB)
Size
注释是一个实现
AnnotationInterface

trait注释接口[T]{
def getValue:T
}
类大小(值:Int)使用AnnotationInterface[Int]扩展StaticAnnotation{
覆盖def getValue:Int=value
}
我有
提取器
,它负责使用反射提取类成员

类提取器[A](隐式
tt:TypeTag[A],
ct:ClassTag[A]
){…使用反射提取类成员…}
然后我将实例化提取器,如:

val提取器:提取器[示例]=
新型提取器
问题:如果像这样注释,我如何调用类
提取器中的方法
getValue:T

@Size(50) name: String
而不是像这样的元注释

@(Size @getter @setter @field)(50) name: String
然后,
@Size
只保留在构造函数参数上,而不是字段、getter或setter上。因此,您需要使用
A
的构造函数

试一试

如果需要

import scala.tools.reflect.ToolBox
val tb = universe.runtimeMirror(getClass.getClassLoader).mkToolBox()

tb.eval(tb.untypecheck(annotationTree)).asInstanceOf[Size].getValue //50
如果您真的想调用
getValue

顺便说一下,如果您可以访问
Size
,并且可以将其设置为case类(或类似case类),那么您可以在编译时执行同样的操作

import shapeless.Annotations

Annotations[Size, Sample].apply() // None :: Some(Size(50)) :: HNil

看起来像X/Yme@cchantep听起来像是一个合理的运行时反射问题。谢谢你的回答。你能给我推荐一些关于反思的读物吗?我觉得这很有趣complicated@yeonhoo这里有教程运行时反射API有意地类似于编译时反射(宏)API,所以您可以阅读Eugene Burmako的论文
import shapeless.Annotations

Annotations[Size, Sample].apply() // None :: Some(Size(50)) :: HNil