让我们说一个班级:
case class Foo(id: Int, name: String, note: Option[String] = None)
Run Code Online (Sandbox Code Playgroud)
自动生成的伴随对象中的构造函数和apply方法都有三个参数.通过反射查看时,标记了第三个参数(注释):
p.isParamWithDefault = true
Run Code Online (Sandbox Code Playgroud)
此外,通过检查,我可以找到在伴随对象中生成值的方法:
method <init>$default$3
Run Code Online (Sandbox Code Playgroud)
和
method apply$default$3
Run Code Online (Sandbox Code Playgroud)
哪两个都有:
m.isParamWithDefault = true
Run Code Online (Sandbox Code Playgroud)
但是,我无法在TermSymbol上找到任何关于notes参数的内容,它实际上指向了正确的方法来获取默认值,也没有找到上述MethodSymbols中指向参数的TermSymbol的任何内容.
是否有直接的方法将参数的TermSymbol与生成其默认值的方法相关联?或者我是否需要做一些像检查伴侣对象上的方法名称一样的事情?
我对这里的case类构造函数示例和常规方法感兴趣.
我正在开发一个需要反射的库,并且需要特定于Scala的信息,而不是通过标准Java反射API提供的信息.现在,我使用scalap无证码(斯卡拉相当于javap的),并试图将其与Java反射对象提供的数据,这样我可以调用方法等(scalap只是解析类文件)相关联.
我找到了这个,但那里什么都没有... https://github.com/dubochet/scala-reflection
...我已经搜索了Scala SVN repo的痕迹并且未能在那里找到它(但它可能是我错过了它).
有没有人知道Scala反射库提供类似于scalap提供的信息,但也允许您调用Java反射库等方法,访问字段等?
[编辑]
我想应该更清楚地解释一下我要做什么......
我想编写一个库来获取文件,比如Excel文件中的分隔文本文件或工作表,顶部有标题,还有一个Manifest,并返回一个Seq对象.所以基本上是一个看起来像这样的函数:
def parseFile[T](fileName: String)(implicit manifest: Manifest[T]): Seq[T] = {
// lots of magic ...
}
Run Code Online (Sandbox Code Playgroud)
在一般情况下,这可能是不可能的,而且我确信有很多"可能"的情况非常困难,但我认为有一个有用的子集可以在没有太多复杂性的情况下实现scalap(或scala.reflect,两者相似但又不同......)并将其与Java反射API中的正确对象结合.我的基本计划是查看文件的标题,查看公共构造函数的参数名称和类型,并在随播对象上应用方法,选择与文件最匹配的方法,并将文件解析为对象.这适用于比应用程序构建更接近脚本的东西.所以我大多只是想要建立一些可以节省时间的东西.
因此,我正在编写的库既没有它所创建的类的先验知识,也没有它所使用的文件的基本结构(分隔的表格文本,Excel等)之外的任何东西.优选地,它应该是微创的.
我以前在Python中做过类似的事情,但它是侵入性的,因为我要么必须使用指定所需类型的描述符,要么我需要使描述符都接受字符串并转换为适当的类型.我认为Scala丰富的类型信息可以减少侵入性.
我正在寻找类似于Scoda的JodaTime或JSR 310的东西,它利用了很好的Scala功能,例如运算符重载,并且不依赖于隐式转换(我对隐式转换有一种非理性的恐惧).
我知道http://github.com/jorgeortiz85/scala-time,但它只是让JodaTime陷入困境.
有没有人知道一个好的Scala或Java库可以解决格式错误的URI中的常见问题,例如包含应该被转义但不是的字符?