blob: 3f4873bbee2dd2933ab64721a1fec21795bbc4fc (
plain) (
blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
|
class C {
val foo = 11
def bar = 12
val quux = 13
def baz = 14
class C { override def toString = "CC" }
object O { override def toString = "CO" }
override def toString = "an instance of class C"
}
class D extends C {
override val foo = 21
override def bar = 22
override def toString = "an instance of class D"
}
class E {
val foo = 31
def bar = 32
val quux = 33
def baz = 34
class C { override def toString = "EC" }
object O { override def toString = "EO" }
override def toString = "an instance of class E"
}
object Test extends App {
import scala.reflect.runtime.universe._
import scala.reflect.runtime.{currentMirror => cm}
val im = cm.reflect(new D)
def test(tpe: Type): Unit = {
def failsafe(action: => Any): Any = try action catch { case ex: Throwable => ex.toString }
println(s"=========members of ${tpe.typeSymbol.name} in a mirror of D=========")
println("field #1: " + failsafe(im.reflectField(tpe.member(TermName("foo")).asTerm).get))
println("method #1: " + failsafe(im.reflectMethod(tpe.member(TermName("bar")).asMethod)()))
println("field #2: " + failsafe(im.reflectField(tpe.member(TermName("quux")).asTerm).get))
println("method #2: " + failsafe(im.reflectMethod(tpe.member(TermName("baz")).asMethod)()))
println("constructor #1: " + failsafe(cm.reflectClass(im.symbol).reflectConstructor(tpe.member(TermName("bar")).asMethod)()))
println("constructor #2: " + failsafe(cm.reflectClass(im.symbol).reflectConstructor(tpe.member(TermName("<init>")).asMethod)()))
println("class: " + failsafe(im.reflectClass(tpe.member(TypeName("C")).asClass).reflectConstructor(typeOf[C].member(TypeName("C")).asClass.info.member(termNames.CONSTRUCTOR).asMethod)()))
println("object: " + failsafe(im.reflectModule(tpe.member(TermName("O")).asModule).instance))
println()
}
test(typeOf[C])
test(typeOf[D])
test(typeOf[E])
}
|