How can I get all (non-final) vals and subobject vals objects using reflection in Scala?

Note. This question is not a duplicate. How can I get all vals and subobject vals objects using reflection in Scala?

The answer provided in this question only works for end participants.

For instance:

scala> object Settings { | val Host = "host" | } defined module Settings deepMembers(Settings) res0: Map[String,String] = Map() 
+2
source share
2 answers

This should be a duplicate, but I need to update:

 $ scala Welcome to Scala version 2.11.7 (Java HotSpot(TM) 64-Bit Server VM, Java 1.8.0_45). Type in expressions to have them evaluated. Type :help for more information. scala> object Settings { val Host = "host" ; val Guest = "guest" } defined object Settings scala> import reflect.runtime._,universe._ import reflect.runtime._ import universe._ scala> val im = currentMirror reflect Settings im: reflect.runtime.universe.InstanceMirror = instance mirror for Settings$@c8e4bb0 scala> im.symbol.asClass.typeSignature.members filter (s => s.isTerm && s.asTerm.isAccessor) res0: Iterable[reflect.runtime.universe.Symbol] = SynchronizedOps(value Guest, value Host) scala> res0 map (im reflectMethod _.asMethod) map (_.apply()) res2: Iterable[Any] = List(guest, host) 
+3
source
 val members = Settings.getClass.getDeclaredFields.map(_.getName).filterNot(_ == "MODULE$") members: Array[String] = Array(Host) 

This works, but I think, of course, the best way to do this.

0
source

Source: https://habr.com/ru/post/955028/


All Articles