bearbeiten besonderer Dank an @Seth Tisue (bis Stimmen und akzeptiert ihn bitte)
class Test extends A {
val field:Field = this.getClass.getDeclaredField("A$$foo")
field.setAccessible(true)
println(field.get(this).asInstanceOf[String])
}
"A $$ foo" ist der richtige Weg, um das Super-type-Attribut, diese und verwenden this.getClass
zu erhalten . Ich wusste es vorher nicht, aber mit dieser Korrektur funktioniert dein Code einfach großartig!
Erste Idee:
trait A {
private val foo = "Some string"
}
class Test extends A {
val fields: Seq[Field] = this.getClass.getDeclaredFields.toList
val field = fields.filter(x => {
println(x.getName)
x.getName.contains("foo")
}).head
field.setAccessible(true)
println(field.get(this).asInstanceOf[String])
}
Wie Sie sehen können, wenn Sie den Namen des "foo" Variable drucken, ist nicht wirklich "foo", es ist etwas anderes:
A$A295$A$A295$A$$foo
in meinem Fall, und das ist, warum Sie (und ich)
java.lang.NoSuchFieldException: foo at java.lang.Class.getDeclaredField
Also den Fehler bekam, mein i Ich hoffe, jemand kam mit einem besseren, ist schauen, ob "foo" innerhalb des Variablennamens "A $ A295 $ A $ A295 $ A $$ foo" ist, so können Sie sagen, das ist die Variable, die Sie suchen.
Wie Sie aus dem Beispiel sehen können, wirft es auch einen Fehler – Pavel
Ok. Aber wie vermeide ich das? – Oleg
Vielleicht kann [diese] (https://stackoverflow.com/questions/7708485/scala-class-getfields) Antwort helfen? – jrook