A library for inspecting Object schema (e.g., parameter names and its types, constructor, etc.)
libraryDependencies += "org.wvlet" %% "object-schema" % "(version)"import wvlet.obj.ObjectSchema
case class Person(id:Int, name:String)
val scheam = ObjectSchema.of[Person]The retrieved ObjectSchema has detailed information of your class, including:
- Constructor and its argument types and names.
- case class parameters
- Methods
Extracting parameter names is impossible in Java programs, since JVM drops parameters names used in the source code at compile-time. While Scaal retains parameter names within the byte code of the class as ScalaSig. wvlet-obj reads ScalaSig and extract method parameter names and
detailed types (e.g., type parameters used in Generics: e.g., String in List[String]).
wvlet-obj is highly utilized in Airframe, wvlet-jmx to build programs by inspecting the shape of objects.
For example, in the following code wvlet-inject finds the constructor of MyApp class, then list dependencies (Module1, Module2, ...) that are necessary to build an MyApp instance:
class MyApp(m1:Module1, m2:Module2)
trait AppMain {
val p = inject[MyApp]
}In wvlet-jmx, @JMX annotation is used to register JMX parameter to JMX registry server so that we can monitor the behavior of the application outside JVM.
You only need to aad @JMX annotation to start collecting JMX metrics:
case class Metrics(@JMX loadAvg:Double, @JMX memoryUsage:Double)
class MonitoringApp {
@JMX def reportMetrics : Metrics = ...
}wvlet-jmx checks the object schema of Metrics and registers its parameters to JMX registry.
wvlet-config reads Yaml files and binds the data into objects with wvlet-obj.
config.yml
default:
timeout-millis: 100
max-connection: 250
You can read this yaml file as follows:
case class ConnectionConfig(timeoutMillis:Long, maxConnection:Int)
val config = YamlReader.load[ConnectionConfig]("config.yml", "default")
Internally wvlet-obj inspects ConnectionConfig parameterss, and builds the config object by mapping property values written in the Yaml file.