@@ -18,6 +18,7 @@ import net.bytebuddy.matcher.ElementMatchers.isDeclaredBy
1818import java.lang.reflect.InvocationTargetException
1919import java.lang.reflect.Method
2020import java.util.concurrent.ConcurrentHashMap
21+ import java.util.concurrent.locks.ReentrantLock
2122import java.util.function.Function
2223import java.util.function.Supplier
2324import java.util.stream.Collectors
@@ -30,37 +31,40 @@ class Implicit(val namingStrategy: (TypeDescription) -> CharSequence) {
3031 companion object {
3132 private val intfTypeRegistry = ConcurrentHashMap <String , String >()
3233 private val supplierRegistry = ConcurrentHashMap <String , Supplier <* >>()
34+ private val intfTypeRegistryLock = ReentrantLock ()
35+
3336 }
3437
3538 @JvmOverloads
3639 @Suppress(" UNCHECKED_CAST" )
3740 fun <T > create (intf : Class <T >, interceptor : ImplicitInterceptor = ImplicitInterceptor ()): Class <out T > {
3841 if (! intf.isInterface)
3942 throw IllegalArgumentException (" argument must be an interface" )
40-
41- if (intfTypeRegistry.containsKey(intf.name))
42- return Class .forName(intfTypeRegistry.get(intf.name)) as Class <out T >
43-
44- val addField = AddFieldDecorator <T >(intf)::apply
45- val addGetterSetter = AddGetterSetterDecorator <T >(intf)::apply
46- val addConstructor = AddConstructorDecorator <T >(intf, interceptor)::apply
47- val addAlias = AliasDecorator <T >(intf)::apply
48- val addMixin = MixinDecorator <T >(intf)::apply
49- val addEqualsHashCode = AddEqualsHashCodeDecorator <T >(intf)::apply
50- val addToString = AddToStringDecorator <T >(intf)::apply
51- val toMap = ToMapDecorator <T >(intf)::apply
52-
53- val unloaded = toMap(addToString(addEqualsHashCode(
54- addMixin(addAlias(addGetterSetter(addField(addConstructor(init (intf))))))))).make()
55- interceptor.onLoading(unloaded)
56-
57- val loaded = unloaded.load(Implicit ::class .java.classLoader, INJECTION )
58- interceptor.onLoaded(loaded)
59-
60- val loadedType = loaded.loaded
61- intfTypeRegistry.put(intf.name, loadedType.name)
62-
63- return loadedType
43+ try {
44+ intfTypeRegistryLock.lock()
45+ if (intfTypeRegistry.containsKey(intf.name))
46+ return Class .forName(intfTypeRegistry.get(intf.name)) as Class <out T >
47+
48+ val addField = AddFieldDecorator <T >(intf)::apply
49+ val addGetterSetter = AddGetterSetterDecorator <T >(intf)::apply
50+ val addConstructor = AddConstructorDecorator <T >(intf, interceptor)::apply
51+ val addAlias = AliasDecorator <T >(intf)::apply
52+ val addMixin = MixinDecorator <T >(intf)::apply
53+ val addEqualsHashCode = AddEqualsHashCodeDecorator <T >(intf)::apply
54+ val addToString = AddToStringDecorator <T >(intf)::apply
55+ val toMap = ToMapDecorator <T >(intf)::apply
56+
57+ val unloaded = toMap(addToString(addEqualsHashCode(
58+ addMixin(addAlias(addGetterSetter(addField(addConstructor(init (intf))))))))).make()
59+ interceptor.onLoading(unloaded)
60+ val loaded = unloaded.load(Implicit ::class .java.classLoader, INJECTION )
61+ interceptor.onLoaded(loaded)
62+ val loadedType = loaded.loaded
63+ intfTypeRegistry.put(intf.name, loadedType.name)
64+ return loadedType
65+ } finally {
66+ intfTypeRegistryLock.unlock()
67+ }
6468 }
6569
6670 @Suppress(" UNCHECKED_CAST" )
0 commit comments