Chamando o código kotlin do código Java

Dec 18 2022
Introdução A melhor coisa sobre o Kotlin é que ele foi projetado com a interoperabilidade do Java em mente. Isso significa que o código Java existente pode ser chamado de Kotlin e também o código Kotlin pode ser chamado de Java.

Introdução

A melhor coisa sobre o Kotlin é que ele foi projetado com a interoperabilidade Java em mente. Isso significa que o código Java existente pode ser chamado de Kotlin e também o código Kotlin pode ser chamado de Java . Ambas as formas são suportadas.

O código Kotlin pode ser facilmente chamado de Java. Por exemplo, as instâncias de uma classe Kotlin podem ser criadas e operadas perfeitamente em métodos Java. Mas há muitas diferenças que requerem atenção ao chamar o código kotlin dentro do java.

no Android, se você usar kotlin , ainda poderá acessar todas as APIs feitas com Java sem nenhum problema.

Como você pode chamar o código Kotlin do Java?

Código Kotlin compilado para elementos JVM , portanto, muito fácil de acessá-lo a partir do código java.

mas você pode adicionar algumas anotações ao seu código kotlin para facilitar a exposição do código java.

Anotações são meios de anexar metadados ao código.

vamos começar, abra o Intellij Idea, crie um novo projeto Kotlin , selecione gradle para o projeto.

se você deseja adicionar root de fontes java, clique com o botão direito do mouse no diretório principal e no novo diretório, adicione java.

e agora vamos começar a aprender sobre algumas anotações que facilitam o acesso ao código kotlin do java

@JvmStatic

isso é usado para anotar campos estáticos e funções do kotlin para que você possa acessá-los a partir do código java sem precisar adicionar a palavra-chave INSTANCE após o nome da classe.

public object  User{


    @JvmStatic     //use this 
 public   fun getUserName():String="Kururu"
}

public class JavaCode {

    public static void main(String[] args) {
        System.out.println(User.getUserName());  // without INSTANCE KEYWORD

//        System.out.println(new Employee()
//                .getEmployeeName());
    }
}

public object  User{

@JvmStatic
var name:String ="Kururu"
}

@JvmField

usado para acessar campos de instância em classe normal, usamos objeto no exemplo anterior.

mas você pode pensar em como acessar campos em classes Kotlin normais

a resposta está usando a anotação @JvmField

antes de pular para o código, vamos explicar como os campos ou propriedades do kotlin são compilados?

Uma propriedade Kotlin é compilada para os seguintes elementos Java:

  • um método getter, com o nome calculado anexando o getprefixo
  • um método setter, com o nome calculado anexando o setprefixo (somente para varpropriedades).

var firstName: String

esta linha de compilado para o seguinte:

private String firstName;

public String getFirstName() {
    return firstName;
}

public void setFirstName(String firstName) {
    this.firstName = firstName;
}

new ClassName().getFirstName();

Observe que usamos @JvmFieldover the field namepara instruir o compilador Kotlin a não gerar nenhum getter e setter para o mesmo e expô-lo como um campo

class Employee{

    @JvmField    //from java code you can access  firstName
 var firstName:String="Kururu"

}

public static void main(String[] args) {

        
        System.out.println(new  Employee().firstName
        );
    }

esta anotação diz à JVM para associar um nome específico à sua função, isso substituirá o nome da função do código Kotlin.

Kotlin :

@JvmName("getEmployeeName")
fun getEmpName():String{
    return "Abdo";
}

public class JavaCode {

    public static void main(String[] args) {
//        System.out.println(User.getMyUserName());

        System.out.println(new  Employee().getEmployeeName()
        );
    }
}

Normalmente, se você escrever uma função Kotlin com valores de parâmetro padrão, ela ficará visível em Java apenas como uma assinatura completa, com todos os parâmetros presentes. Se você deseja expor várias sobrecargas para chamadores Java, pode usar a anotação.@JvmOverloads

A anotação também funciona para construtores, métodos estáticos e assim por diante. Não pode ser usado em métodos abstratos, incluindo métodos definidos em interfaces.

portanto, esta anotação é usada para indicar parâmetros padrão, portanto, pode ignorá-los do código java, sem isso, você deve passar todos os parâmetros.

isso se aplica a construtores de classe.

Kotlin:

@JvmOverloads fun getEmpName( name:String="abdo"):String{
     return "Abdo";
 }

public static void main(String[] args) {
//        System.out.println(User.getMyUserName());


//access getEmpName()  without need to pass   NAME argument
        System.out.println(new  Employee().getEmployeeName()
        );
    }

este tópico inspirado por seus blogs

veja os blogs dele:https://amitshekhar.me

referências:

https://kotlinlang.org/docs/java-to-kotlin-interop.html

https://amitshekhar.me