Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala 通过反射获取案例类字段的问题_Scala_Generics_Reflection_Scala Reflect - Fatal编程技术网

Scala 通过反射获取案例类字段的问题

Scala 通过反射获取案例类字段的问题,scala,generics,reflection,scala-reflect,Scala,Generics,Reflection,Scala Reflect,我有一个scala代码:trait模型及其带有自定义注释的实现案例类,我希望稍后阅读 导入scala.annotation.StaticAnnotation 类ExtraFields()扩展了StaticAnnotation 性状模型{} 案例类别MyCategory(id:Option[Int], 名称:String, 级别:选项[Int], @外场 父项:选项[MyCategory]=无 )扩展模型{ } 我有trait DBModel及其实现MyCategoryModel。我将MyCat

我有一个scala代码:trait模型及其带有自定义注释的实现案例类,我希望稍后阅读

导入scala.annotation.StaticAnnotation
类ExtraFields()扩展了StaticAnnotation
性状模型{}
案例类别MyCategory(id:Option[Int],
名称:String,
级别:选项[Int],
@外场
父项:选项[MyCategory]=无
)扩展模型{
}
我有trait DBModel及其实现MyCategoryModel。我将MyCategory作为类型参数传递给DBModel

trait DBModel[T
v、 name.toString->v.annotations
}
}
def getClassFields2[T:TypeTag]:Iterable[(字符串,列表[universe.Annotation])]=
typeOf[T].members.collect{
案例m:MethodSymbol如果m.isCaseAccessor=>
m、 name.toString->m.annotations
}
但它们都没有起作用

val res=MyCategoryModel.getFields//运行时异常:自由类型T不是类
val res2=MyCategoryModel.getFields2//编译错误:没有可用于T的TypeTag
如果我直接给他们打电话

getClassFields[MyCategory]
getClassFields2[MyCategory]
对于第一个函数,我得到了相同的错误,对于第二个函数,我得到了结果,但universe.annotations无法看到我的ExtraFields注释,为每个字段返回空列表

你能解释一下这个黑魔法吗?在我的情况下,如何使用它 多谢各位


UPD操场

您缺少
getClassFields
的类型class
WeakTypeTag


此外,您没有在trait
DBModel[T中传递类型类,您缺少
getClassFields
的类型类
WeakTypeTag


此外,您没有在trait
DBModel[T]中传递类型类。请解释一下“@(ExtraFields@param@getter)parent:Option[MyCategory]=None``或提供一个关于@param和@getter的解释链接。在操场上,这行抛出错误@DmitryReutov请阅读@DmitryReutov您缺少导入
import scala.annotation.meta.{getter,param}
@IvanStanislavovich,好的!我找到了您可以解释一下吗`@(ExtraFields@param@getter)父:选项[MyCategory]=None``或提供一个关于@param和@getter的解释链接。在操场上,这行抛出错误@DmitryReutov请阅读@DmitryReutov您缺少导入
import scala.annotation.meta.{getter,param}
@IvanStanislavovich,好的!我知道您可以在编译时找到
shapless.annotations[ExtraFields,MyCategory].apply()
。这将生成
None::None::None::一些(ExtraFields@4f5991f6)::HNil
@DmytroMitin,这对我来说更方便,谢谢你可以在编译时找到无形状的注释。注释[ExtraFields,MyCategory].apply()
。这会产生
None::None::None::None::Some(ExtraFields@4f5991f6)::HNil
@DmytroMitin,这对我来说更方便了,谢谢