These annotations help Kotlin code work smoothly when called from Java. They make Kotlin members easier to use in Java by changing how they appear.
Kotlin annotations for Java callers (@JvmStatic, @JvmField)
@JvmStatic fun functionName() { ... } @JvmField var propertyName: Type = value
@JvmStatic is used on functions or properties inside companion objects or named objects.
@JvmField is used on properties to expose them as fields without getters/setters in Java.
class Example { companion object { @JvmStatic fun greet() { println("Hello from Kotlin") } @JvmField val constant = 42 } }
@JvmStatic and @JvmField in an object for Java-friendly access.object Utils { @JvmStatic fun printMessage(msg: String) { println(msg) } @JvmField val version = "1.0" }
This program defines a companion object with a static-like function and a field. The main function calls the static function and prints the field.
class Demo { companion object { @JvmStatic fun sayHello() { println("Hello from companion object") } @JvmField val number = 100 } } fun main() { Demo.sayHello() println("Number is: ${Demo.number}") }
@JvmStatic makes Kotlin companion object functions appear as static methods in Java, so Java code can call Demo.sayHello() directly.
@JvmField exposes the property as a public field in Java, avoiding getter/setter methods.
Without these annotations, Java callers must use Kotlin's default access patterns, which can be less convenient.
@JvmStatic makes Kotlin functions in companion objects look like static methods in Java.
@JvmField exposes Kotlin properties as fields for direct access from Java.
These annotations improve Kotlin-Java interoperability and make Java code cleaner and simpler.
Practice
@JvmStatic annotation in Kotlin when called from Java?Solution
Step 1: Understand the role of @JvmStatic
@JvmStatic makes functions inside Kotlin companion objects look like static methods in Java, so Java code can call them without an instance.Step 2: Differentiate from @JvmField
@JvmField exposes properties as fields, not functions. The question asks about functions, so @JvmStatic is correct.Final Answer:
To make a Kotlin function in a companion object appear as a static method in Java -> Option CQuick Check:
@JvmStatic = static method in Java [OK]
- Confusing @JvmStatic with @JvmField
- Thinking @JvmStatic applies to properties
- Assuming it changes Kotlin class types
Solution
Step 1: Identify the annotation for exposing fields
@JvmField exposes Kotlin properties as public fields for direct Java access, bypassing getters/setters.Step 2: Eliminate other options
@JvmStatic applies to functions, not properties. @JvmOverloads is for default parameters. val alone does not expose as field.Final Answer:
Annotate the property with @JvmField -> Option BQuick Check:
@JvmField = public field in Java [OK]
- Using @JvmStatic on properties
- Assuming val exposes public field automatically
- Confusing @JvmOverloads with field exposure
class Example {
companion object {
@JvmStatic
fun greet() = "Hello from static"
fun greetInstance() = "Hello from instance"
}
}
// Java code:
System.out.println(Example.greet());
System.out.println(Example.Companion.greetInstance());Solution
Step 1: Understand @JvmStatic effect on Java calls
@JvmStatic makes greet() callable as a static method on Example class directly from Java.Step 2: Understand companion object function call
greetInstance() is not annotated, so Java must call it via Example.Companion instance.Final Answer:
Hello from static\nHello from instance -> Option DQuick Check:
@JvmStatic allows direct static call, others via Companion [OK]
- Assuming all companion functions are static in Java
- Trying to call unannotated functions as static
- Ignoring the Companion object in Java calls
count as a public field:
class Counter {
companion object {
var count = 0
}
}Solution
Step 1: Understand property exposure to Java
To expose a Kotlin property as a public field in Java, it must be annotated with @JvmField.Step 2: Check annotations and property modifiers
@JvmStatic applies to functions, not properties. Companion objects can have properties. var is allowed.Final Answer:
Missing @JvmField on count -> Option AQuick Check:
Expose property as field = use @JvmField [OK]
- Using @JvmStatic on properties
- Thinking companion objects can't have properties
- Confusing var and val for Java exposure
MAX accessible as a static field from Java, and a function printMax() callable as a static method from Java. Which is the correct Kotlin code?Solution
Step 1: Expose constant as static field
Use @JvmField on val MAX to expose it as a static field in Java.Step 2: Expose function as static method
Use @JvmStatic on printMax() to make it callable as a static method from Java.Step 3: Verify other options
class Utils { companion object { val MAX = 100 fun printMax() = println(MAX) } } lacks annotations, so Java calls require Companion. class Utils { companion object { @JvmStatic val MAX = 100 @JvmField fun printMax() = println(MAX) } } swaps annotations incorrectly. class Utils { companion object { const val MAX = 100 fun printMax() = println(MAX) } } uses const val but no @JvmStatic on function.Final Answer:
The code with @JvmField on MAX and @JvmStatic on printMax() -> Option AQuick Check:
@JvmField for fields, @JvmStatic for static methods [OK]
- Swapping @JvmField and @JvmStatic annotations
- Omitting annotations and expecting static access
- Using const val without @JvmStatic on functions
Ready to prove it?
Pass the test and this pattern moves unknown
