リフレクションを使用して、パッケージオブジェクトに定義されたフィールドを取得する必要があります。パッケージオブジェクトのフィールドのFieldMirrorを取得する
package com.coryklein
package object kittens {
val purr = "meow"
}
Scalaはオブジェクトのみのインスタンスmethods--メソッドがオブジェクトインスタンスのインスタンスメソッドですしている、ModuleMirror.instance
によって得る寛大にもありますリフレクションを使用して定義されたクラスのメソッドx
を呼び出す例C
scala> class C { def x = 2 }
defined class C
scala> val im = m.reflect(new C)
im: reflect.runtime.universe.InstanceMirror = instance mirror for [email protected]
scala> val methodX = typeOf[C].declaration(TermName("x")).asMethod
methodX: reflect.runtime.universe.MethodSymbol = method x
scala> val mm = im.reflectMethod(methodX)
mm: reflect.runtime.universe.MethodMirror = method mirror for C.x: scala.Int (bound to [email protected])
scala> mm()
res0: Any = 2
ここから、パッケージオブジェクトに存在するフィールドを反映させるアプローチを適用することはあまり難しくありません。ただし、パッケージオブジェクトには、リフレクションからフィールドを取得するための対応するクラスがありません。
私は項記号入手することができました:
val ts: TermSymbol = mirror.staticPackage("com.coryklein.kittens").info.decls
.find(_.name.decodedName.toString == "purr").get.asTerm
をしかし、この時点で、私がこのフィールドを反映するために、上からim
と同等のインスタンス鏡を持っていません。
purr
valは、Scalaのリフレクションによってパッケージオブジェクトkittens
に定義されていますか?