在 Scala 中,是否可以使用反射来访问内部类的外部类?例如:
class A {
val inner = new {
println(getClass.getConstructors.toList)
println(getClass.getDeclaredFields.toList)
}
}
scala> val a = new A
List(public $line11.$read$$iw$$iw$A$$anon$1($line11.$read$$iw$$iw$A))
List()
a: A = A@45f76fc7
我认为 Scala 编译器在某处保存了对外部类的引用,但您可以在这里看到构造函数中打印的字段列表是空的。此外,看起来构造函数引用了外部类实例(但很难确定——我不确定这里到底发生了什么)。我也注意到在某些情况下有一个
$outer
字段似乎是我需要的,但它并不总是存在,我不明白这一点。为什么???!!! 我有一个内部类,我需要创建一个使用反射的新实例。新实例是从现有实例复制的,并且需要具有相同的外部引用。
最佳答案
我不认为你可以可靠地获得父级,除非你在构造函数之外使用父级,如果是内部类。鉴于:
class X {
val str = "xxyy"
val self = this
val inner = new {
override def toString():String = {
"inner " + self.toString
}
}
override def toString():String = {
"ima x" + this.str
}
}
如果你做 javap 你会得到一个私有(private)字段 $outer
但给出:
class X {
val str = "xxyy"
val self = this
val inner = new {
println(self)
}
override def toString():String = {
"ima x" + this.str
}
}
javap 不指示 $outer 字段。
关于scala - 在 Scala 中使用反射访问外部类,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/7325200/