DEV Community

Kenji Tomita
Kenji Tomita

Posted on

Learning about @JvmMultifileClass

What is @JvmMultifileClass?

The JvmMultifileClass annotation is described as follows.

Instructs the Kotlin compiler to generate a multifile class with top-level functions and properties declared in this file as one of its parts. Name of the corresponding multifile class is provided by the JvmName annotation.

https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.jvm/-jvm-multifile-class/
https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.jvm/-jvm-name/

Let's decompile

Create a Utils.kt and define the foo method. The foo method just prints foo.

// Utils.kt

fun foo() {
    println("foo")
}
Enter fullscreen mode Exit fullscreen mode

When decompiled, it looks like this.

// Utils.decompiled.java

public final class UtilsKt {
   public static final void foo() {
      String var0 = "foo";
      boolean var1 = false;
      System.out.println(var0);
   }
}
Enter fullscreen mode Exit fullscreen mode

Let's add @JvmName and @JvmMultifileClass.

// Utils.kt

@file:JvmName("NewUtils")
@file:JvmMultifileClass

fun foo() {
    println("foo")
}
Enter fullscreen mode Exit fullscreen mode

Let's decompile. I specified NewUtils in the @JvmName annotation, the NewUtils class was generated. In addition, a facade class (NewUtils__UtilsKt) has been generated.

// Utils.decompiled.java

public final class NewUtils {
   public static final void foo() {
      NewUtils__UtilsKt.foo();
   }
}

final class NewUtils__UtilsKt {
   public static final void foo() {
      String var0 = "foo";
      boolean var1 = false;
      System.out.println(var0);
   }
}
Enter fullscreen mode Exit fullscreen mode

If you specify @file: JvmName("NewUtils") fot multiple files, the following error will occur.

Duplicate JVM class name 'NewUtils' generated from: package-fragment, package-fragment

This can be solved by adding @JvmMultifileClass. @JvmMultifileClass annotation can be used to generate and organize facade classes.

Top comments (1)

Collapse
 
brandonirizarry profile image
BrandonIrizarry

Interesting. I came across this in the context of how to organize extension functions in a Kotlin codebase, and had come across this SO answer. However, the answer isn't clear on how to use that annotation, which is what brought me here.