在 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/

10-16 14:01