Caching und Identität
TypeResolver hält eine ResolvedClass pro Type für die Lebensdauer des Programms. Auflösen ist nach dem ersten Mal billig, und das Modell wächst faul mit der Nutzung.
Derselbe Typ, dieselbe Instanz
resolve sucht den Type zuerst in einer Map. Zwei ResolvedClasses sind gleich, wenn ihre underlying-Typen gleich sind.
Bezahlt beim ersten Zugriff
hierarchy, fields, methods, constructors und annotations sind lazy vals. Der erste Aufruf liest die Reflection-Daten der JVM, jeder spätere liefert die zwischengespeicherten Arrays.
Die Cache-Map ist nicht synchronisiert
In 1.0.4 sind Typ-Cache, Companion-Cache und die Caches der Introspektoren einfache Hash-Maps ohne Synchronisierung. Gleichzeitiges erstes Auflösen verschiedener Typen kann darauf kollidieren.
Löse in einem Server die Typen, die du mappst, beim Start auf, bevor Anfragen kommen, oder serialisiere das erste Auflösen selbst. Das Lesen bereits zwischengespeicherter Typen ist sicher, solange nicht gleichzeitig geschrieben wird.