Back to Intellij Community

SuspiciousJavaClassCallableReference

plugins/kotlin/code-insight/descriptions/resources-en/inspectionDescriptions/SuspiciousJavaClassCallableReference.html

2025.3-rc-21.4 KB
Original Source

Reports suspicious cases of kotlin.jvm.javaClass extension used as a callable reference.

Using ::javaClass syntax does not result in a Class<T> instance, as someone might expect.
Instead, it creates a property reference of type KProperty0<Class<T>>, which is almost never correct and can lead to unexpected behavior and hard-to-detect bugs.

Provides a fix to use a direct .javaClass call or ::class.java syntax instead.

Example 1: Expression receiver

When ::javaClass is used on an expression, the quick-fix replaces it with a regular .javaClass call:

fun test(a: String) {
      val classRef = a::javaClass // KProperty0<Class<String>>
      println(classRef) // Prints "property javaClass", not "class java.lang.String"
  }

After the quick-fix is applied:

fun test(a: String) {
      val classRef = a.javaClass // Class<String>
      println(classRef) // Prints "java.lang.String"
  }

Example 2: Type receiver

When ::javaClass is used on a type, the quick-fix replaces it with ::class.java:

fun test() {
      val classRef = String::javaClass // KProperty1<String, Class<String>>
      println(classRef) // Prints "property javaClass", not "class java.lang.String"
  }

After the quick-fix is applied:

fun test() {
      val classRef = String::class.java // Class<Any>
      println(classRef) // Prints "class java.lang.String"
  }