Skip to content

Commit 3f46359

Browse files
committed
Fixed to use cached Java Class
To improve performance on the first run.
1 parent cb77d11 commit 3f46359

File tree

8 files changed

+35
-14
lines changed

8 files changed

+35
-14
lines changed

src/main/kotlin/io/github/projectmapk/jackson/module/kogera/ClosedRangeSupport.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,7 @@ internal object ClosedRangeResolver : SimpleAbstractTypeResolver() {
6767
override fun findTypeMapping(config: DeserializationConfig, type: JavaType): JavaType? {
6868
val rawClass = type.rawClass
6969

70-
return if (rawClass == ClosedRange::class.java || rawClass == ClosedFloatingPointRange::class.java) {
70+
return if (rawClass == ClosedRange::class.java || rawClass == CLOSED_FLOATING_POINT_RANGE_CLASS) {
7171
type.bindings.typeParameters.firstOrNull()
7272
?.let { typeParam ->
7373
findClosedFloatingPointRangeRef(typeParam.rawClass)?.let {

src/main/kotlin/io/github/projectmapk/jackson/module/kogera/InternalCommons.kt

Lines changed: 19 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
package io.github.projectmapk.jackson.module.kogera
22

33
import com.fasterxml.jackson.annotation.JsonCreator
4+
import com.fasterxml.jackson.annotation.JsonProperty
5+
import io.github.projectmapk.jackson.module.kogera.annotation.JsonKUnbox
46
import kotlinx.metadata.KmClass
57
import kotlinx.metadata.KmClassifier
68
import kotlinx.metadata.KmType
@@ -14,11 +16,11 @@ import java.lang.reflect.Method
1416
internal typealias JavaDuration = java.time.Duration
1517
internal typealias KotlinDuration = kotlin.time.Duration
1618

17-
internal fun Class<*>.toKmClass(): KmClass? = getAnnotation(Metadata::class.java)?.let {
19+
internal fun Class<*>.toKmClass(): KmClass? = getAnnotation(METADATA_CLASS)?.let {
1820
(KotlinClassMetadata.readStrict(it) as KotlinClassMetadata.Class).kmClass
1921
}
2022

21-
internal fun Class<*>.isUnboxableValueClass() = this.isAnnotationPresent(JvmInline::class.java)
23+
internal fun Class<*>.isUnboxableValueClass() = this.isAnnotationPresent(JVM_INLINE_CLASS)
2224

2325
// JmClass must be value class.
2426
internal fun JmClass.wrapsNullValueClass() = inlineClassUnderlyingType!!.isNullable
@@ -88,6 +90,20 @@ internal fun String.reconstructClass(): Class<*> {
8890
internal fun KmType.reconstructClassOrNull(): Class<*>? = (classifier as? KmClassifier.Class)
8991
?.let { kotlin.runCatching { it.name.reconstructClass() }.getOrNull() }
9092

91-
internal fun AnnotatedElement.hasCreatorAnnotation(): Boolean = getAnnotation(JsonCreator::class.java)
93+
internal fun AnnotatedElement.hasCreatorAnnotation(): Boolean = getAnnotation(JSON_CREATOR_CLASS)
9294
?.let { it.mode != JsonCreator.Mode.DISABLED }
9395
?: false
96+
97+
// Instantiating Java Class as a static property is expected to improve first-time execution performance.
98+
// However, maybe this improvement is limited to Java Classes that are not used to initialize static content.
99+
// Also, for classes that are read at the time of initialization of static content or module initialization,
100+
// optimization seems unnecessary because caching is effective.
101+
internal val METADATA_CLASS = Metadata::class.java
102+
internal val JVM_INLINE_CLASS = JvmInline::class.java
103+
internal val JSON_CREATOR_CLASS = JsonCreator::class.java
104+
internal val JSON_PROPERTY_CLASS = JsonProperty::class.java
105+
internal val JSON_K_UNBOX_CLASS = JsonKUnbox::class.java
106+
internal val KOTLIN_DURATION_CLASS = KotlinDuration::class.java
107+
// internal val CLOSED_RANGE_CLASS = ClosedRange::class.java // called during module initialization
108+
internal val CLOSED_FLOATING_POINT_RANGE_CLASS = ClosedFloatingPointRange::class.java
109+
internal val ANY_CLASS = Any::class.java

src/main/kotlin/io/github/projectmapk/jackson/module/kogera/KotlinClassIntrospector.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@ internal object KotlinClassIntrospector : BasicClassIntrospector() {
5050
?: run {
5151
val coll = collectProperties(config, type, r, true)
5252

53-
if (type.rawClass.isAnnotationPresent(Metadata::class.java)) {
53+
if (type.rawClass.isAnnotationPresent(METADATA_CLASS)) {
5454
KotlinBeanDescription(coll)
5555
} else {
5656
BasicBeanDescription.forDeserialization(coll)
@@ -71,7 +71,7 @@ internal object KotlinClassIntrospector : BasicClassIntrospector() {
7171
?: run {
7272
val coll = collectProperties(config, type, r, false)
7373

74-
if (type.rawClass.isAnnotationPresent(Metadata::class.java)) {
74+
if (type.rawClass.isAnnotationPresent(METADATA_CLASS)) {
7575
KotlinBeanDescription(coll)
7676
} else {
7777
BasicBeanDescription.forDeserialization(coll)

src/main/kotlin/io/github/projectmapk/jackson/module/kogera/ReflectionCache.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,7 @@ internal class ReflectionCache(initialCacheSize: Int, maxCacheSize: Int) : Seria
5454
val superJmClass = if (!clazz.isInterface) {
5555
clazz.superclass?.let {
5656
// Stop parsing when `Object` is reached
57-
if (it != Any::class.java) getJmClass(it) else null
57+
if (it != ANY_CLASS) getJmClass(it) else null
5858
}
5959
} else {
6060
null

src/main/kotlin/io/github/projectmapk/jackson/module/kogera/annotationIntrospector/KotlinFallbackAnnotationIntrospector.kt

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,8 @@ import com.fasterxml.jackson.databind.introspect.AnnotatedMethod
1212
import com.fasterxml.jackson.databind.introspect.AnnotatedParameter
1313
import com.fasterxml.jackson.databind.introspect.NopAnnotationIntrospector
1414
import com.fasterxml.jackson.databind.util.Converter
15+
import io.github.projectmapk.jackson.module.kogera.JSON_K_UNBOX_CLASS
16+
import io.github.projectmapk.jackson.module.kogera.KOTLIN_DURATION_CLASS
1517
import io.github.projectmapk.jackson.module.kogera.KotlinDuration
1618
import io.github.projectmapk.jackson.module.kogera.ReflectionCache
1719
import io.github.projectmapk.jackson.module.kogera.annotation.JsonKUnbox
@@ -74,15 +76,15 @@ internal class KotlinFallbackAnnotationIntrospector(
7476
override fun findSerializationConverter(a: Annotated): Converter<*, *>? = when (a) {
7577
// Find a converter to handle the case where the getter returns an unboxed value from the value class.
7678
is AnnotatedMethod -> cache.findBoxedReturnType(a.member)?.let {
77-
if (useJavaDurationConversion && it == KotlinDuration::class.java) {
78-
if (a.rawReturnType == KotlinDuration::class.java) {
79+
if (useJavaDurationConversion && it == KOTLIN_DURATION_CLASS) {
80+
if (a.rawReturnType == KOTLIN_DURATION_CLASS) {
7981
KotlinToJavaDurationConverter
8082
} else {
8183
KotlinDurationValueToJavaDurationConverter
8284
}
8385
} else {
8486
// If JsonUnbox is specified, the unboxed getter is used as is.
85-
if (a.hasAnnotation(JsonKUnbox::class.java) || it.isAnnotationPresent(JsonKUnbox::class.java)) {
87+
if (a.hasAnnotation(JSON_K_UNBOX_CLASS) || it.isAnnotationPresent(JSON_K_UNBOX_CLASS)) {
8688
null
8789
} else {
8890
cache.getValueClassBoxConverter(a.rawReturnType, it)
@@ -95,7 +97,7 @@ internal class KotlinFallbackAnnotationIntrospector(
9597

9698
private fun lookupKotlinTypeConverter(a: AnnotatedClass) = when {
9799
Sequence::class.java.isAssignableFrom(a.rawType) -> SequenceToIteratorConverter(a.type)
98-
KotlinDuration::class.java == a.rawType -> KotlinToJavaDurationConverter.takeIf { useJavaDurationConversion }
100+
KOTLIN_DURATION_CLASS == a.rawType -> KotlinToJavaDurationConverter.takeIf { useJavaDurationConversion }
99101
else -> null
100102
}
101103

src/main/kotlin/io/github/projectmapk/jackson/module/kogera/annotationIntrospector/KotlinPrimaryAnnotationIntrospector.kt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ import com.fasterxml.jackson.databind.introspect.AnnotatedMethod
1212
import com.fasterxml.jackson.databind.introspect.AnnotatedParameter
1313
import com.fasterxml.jackson.databind.introspect.NopAnnotationIntrospector
1414
import com.fasterxml.jackson.databind.jsontype.NamedType
15+
import io.github.projectmapk.jackson.module.kogera.JSON_PROPERTY_CLASS
1516
import io.github.projectmapk.jackson.module.kogera.JmClass
1617
import io.github.projectmapk.jackson.module.kogera.ReflectionCache
1718
import io.github.projectmapk.jackson.module.kogera.hasCreatorAnnotation
@@ -42,7 +43,7 @@ internal class KotlinPrimaryAnnotationIntrospector(
4243
// If JsonProperty.required is true, the behavior is clearly specified and the result is paramount.
4344
// Otherwise, the required is determined from the configuration and the definition on Kotlin.
4445
override fun hasRequiredMarker(m: AnnotatedMember): Boolean? {
45-
val byAnnotation = _findAnnotation(m, JsonProperty::class.java)
46+
val byAnnotation = _findAnnotation(m, JSON_PROPERTY_CLASS)
4647
?.let { if (it.required) return true else false }
4748

4849
return cache.getJmClass(m.member.declaringClass)?.let {

src/main/kotlin/io/github/projectmapk/jackson/module/kogera/deser/valueInstantiator/creator/MethodValueCreator.kt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package io.github.projectmapk.jackson.module.kogera.deser.valueInstantiator.creator
22

3+
import io.github.projectmapk.jackson.module.kogera.ANY_CLASS
34
import io.github.projectmapk.jackson.module.kogera.JmClass
45
import io.github.projectmapk.jackson.module.kogera.ReflectionCache
56
import io.github.projectmapk.jackson.module.kogera.call
@@ -52,7 +53,7 @@ internal class MethodValueCreator<T>(
5253
for (i in (valueParameterSize + 1)..(valueParameterSize + maskSize)) { // masks
5354
temp[i] = Int::class.java
5455
}
55-
temp[valueParameterSize + maskSize + 1] = Object::class.java // maker
56+
temp[valueParameterSize + maskSize + 1] = ANY_CLASS // maker
5657
temp
5758
} as Array<Class<*>>
5859

src/main/kotlin/io/github/projectmapk/jackson/module/kogera/ser/Converters.kt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import com.fasterxml.jackson.databind.JavaType
44
import com.fasterxml.jackson.databind.type.TypeFactory
55
import com.fasterxml.jackson.databind.util.StdConverter
66
import io.github.projectmapk.jackson.module.kogera.JavaDuration
7+
import io.github.projectmapk.jackson.module.kogera.KOTLIN_DURATION_CLASS
78
import io.github.projectmapk.jackson.module.kogera.KotlinDuration
89
import io.github.projectmapk.jackson.module.kogera.ValueClassBoxConverter
910
import kotlin.time.toJavaDuration
@@ -20,7 +21,7 @@ internal class SequenceToIteratorConverter(private val input: JavaType) : StdCon
2021
}
2122

2223
internal object KotlinDurationValueToJavaDurationConverter : StdConverter<Long, JavaDuration>() {
23-
private val boxConverter by lazy { ValueClassBoxConverter(Long::class.java, KotlinDuration::class.java) }
24+
private val boxConverter by lazy { ValueClassBoxConverter(Long::class.java, KOTLIN_DURATION_CLASS) }
2425

2526
override fun convert(value: Long): JavaDuration = KotlinToJavaDurationConverter.convert(boxConverter.convert(value))
2627
}

0 commit comments

Comments
 (0)