Caching and identity
TypeResolver keeps one ResolvedClass per Type for the life of the program. Resolving is cheap after the first time, and the model grows lazily as you use it.
The same type, the same instance
resolve looks the Type up in a map first. Two ResolvedClasses are equal when their underlying types are equal.
Paid on first access
hierarchy, fields, methods, constructors and annotations are lazy vals. The first call reads the JVM's reflection data, every later call returns the cached arrays.
The cache map is not synchronized
In 1.0.4 the type cache, the companion cache and the introspector caches are plain hash maps without synchronization. Concurrent first-time resolves of different types can race on them.
In a server, resolve the types you map during startup, before requests arrive, or serialize the first resolve yourself. Reading already cached types is safe as long as nothing writes at the same time.