Scala - объявленные поля класса и модификаторы доступа - PullRequest
7 голосов
/ 20 июля 2011

Я экспериментировал с Манифестами и тому подобным в Scala, и мне очень трудно найти способ использовать поля объекта при доступе через метод getDeclaredFields ...

Вот пример:

class Woah(val x: String, val y: String)

val w = new Woah("w_x", "w_y")
classOf[Woah].getDeclaredFields foreach (field => println(field.get(w))

Я перепробовал много вариантов, например, создал метод внутри класса Woah, который выполняет то же действие, что и третья строка кода, но заменил field.get (w) на field.get (this), и он показывает такое же исключение. Исключение:

java.lang.IllegalAccessException: Class Fun$Woah$$anonfun$1 can not access a member of class Fun$Woah with modifiers "private final"
    at sun.reflect.Reflection.ensureMemberAccess(Reflection.java:65)
    at java.lang.reflect.Field.doSecurityCheck(Field.java:960)
    at java.lang.reflect.Field.getFieldAccessor(Field.java:896)
    at java.lang.reflect.Field.get(Field.java:358)
    at Fun$Woah$$anonfun$1.apply(Fun.scala:17)
    at Fun$Woah$$anonfun$1.apply(Fun.scala:17)
    at scala.collection.IndexedSeqOptimized$class.foreach(IndexedSeqOptimized.scala:34)
    at scala.collection.mutable.ArrayOps.foreach(ArrayOps.scala:35)
    at Fun$Woah.<init>(Fun.scala:17)
    at Fun$.main(Fun.scala:20)
    at Fun.main(Fun.scala)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    at java.lang.reflect.Method.invoke(Method.java:597)
    at scala.tools.nsc.util.ScalaClassLoader$$anonfun$run$1.apply(ScalaClassLoader.scala:81)
    at scala.tools.nsc.util.ScalaClassLoader$class.asContext(ScalaClassLoader.scala:24)
    at scala.tools.nsc.util.ScalaClassLoader$URLClassLoader.asContext(ScalaClassLoader.scala:86)
    at scala.tools.nsc.util.ScalaClassLoader$class.run(ScalaClassLoader.scala:81)
    at scala.tools.nsc.util.ScalaClassLoader$URLClassLoader.run(ScalaClassLoader.scala:86)
    at scala.tools.nsc.MainGenericRunner$.main(MainGenericRunner.scala:83)
    at scala.tools.nsc.MainGenericRunner.main(MainGenericRunner.scala)

Я провел столько поисков, сколько смог, и сейчас не нахожу новых идей. Из того, что я мог найти, значения "x" и "y" в классе Woah объявлены как private final, потому что они используются вне конструктора. Поэтому я тоже попробовал это:

* * 1010

К сожалению, выдается то же исключение. Есть ли какой-нибудь способ сделать эти два значения публичными? Или же можно достичь той же цели другим путем? Я просто заинтересован в доступе к коллекции значений полей класса.

Заранее благодарю за помощь!

Ответы [ 2 ]

12 голосов
/ 20 июля 2011
class Woah(val x: String, val y: String) {
  def printParams = classOf[Woah].getDeclaredFields foreach { field =>
    field.setAccessible(true)
    println(field.get(this))
  }
}
0 голосов
/ 25 июля 2011

Все поля JVM в Scala являются частными.Доступ к ним осуществляется только через геттеры в Scala, так что нет никакого различия между ними и методом без параметров.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...