Ho un oggetto che assomiglia a questo:Come posso ottenere tutti gli oggetti vals e subobject vals usando reflection in Scala?
object Settings {
final val Host = "host"
final val Protocol = "protocol"
object User {
final val Name = "username"
final val Password = "password"
}
object Subject {
final val Query = "query"
final val Predicate = "predicate"
}
}
Quello che mi piacerebbe fare è qualcosa di simile membersAsHash(classOf[CollectionSettings])
e ricevere un hash) di tutte le vals che ho dichiarato nell'oggetto:
[
Host => "host",
Protocol => "protocol",
Name => "username",
Password => "password",
Query => "query",
Predicate => "predicate"
]
Sarebbe perfetto se la chiave fosse una stringa, anche il nome completo del pacchetto (ad esempio com.example.Settings.User). Quello di cui ho veramente bisogno sono i valori, quindi se posso ottenerlo, è ancora accettabile.
questo mi ha preso il nome degli oggetti secondari, ma io non riesco a capire come ottenere i vals che sono interni a ciascuno:
val optionsToCheck = {
import scala.reflect.runtime.{universe => ru}
val mirror = ru.runtimeMirror(getClass.getClassLoader)
val subObjects = ru.typeOf[CollectionSettings.type].declarations.filter(_.isModule)
subobjects.map(o => mirror.reflectModule(o.asModule).instance.asInstanceOf[Object].toString).toList
}
Questo è stato super efficace. Grazie! –
@TravisBrown: come posso farlo funzionare per i membri non finali? –
@VenkatSudheerReddyAedama Probabilmente merita una nuova domanda: se ne pubblichi uno posso provare a dare un'occhiata stasera. –