การเรียกรหัส kotlin จาก Java Code

Dec 18 2022
บทนำ สิ่งที่ดีที่สุดเกี่ยวกับ Kotlin คือได้รับการออกแบบโดยคำนึงถึงความสามารถในการทำงานร่วมกันของ Java หมายความว่าสามารถเรียกโค้ด Java ที่มีอยู่จาก Kotlin ได้ และยังสามารถเรียกโค้ด Kotlin จาก Java ได้อีกด้วย

บทนำ

สิ่งที่ดีที่สุดเกี่ยวกับKotlinคือการออกแบบโดยคำนึงถึงความสามารถในการทำงานร่วมกันของ Java หมายความว่าโค้ด Java ที่มีอยู่ สามารถเรียกได้จากKotlinและยังสามารถเรียกโค้ด Kotlin จาก Javaได้อีกด้วย รองรับทั้งสองวิธี

สามารถเรียกใช้โค้ด Kotlin จาก Java ได้อย่างง่ายดาย ตัวอย่างเช่น อินสแตนซ์ของคลาส Kotlin สามารถสร้างและดำเนินการได้อย่างราบรื่นในเมธอดของ Java แต่มีความแตกต่างมากมายที่ต้องให้ความสนใจเมื่อเรียก โค้ด kotlinภายในจาวา

ใน Android หากคุณใช้kotlinคุณยังสามารถเข้าถึง API ทั้งหมดที่สร้างด้วยJavaได้โดยไม่มีปัญหา

คุณจะเรียก Kotlin Code จาก Java ได้อย่างไร

โค้ด Kotlin คอมไพล์เป็นองค์ประกอบ JVMดังนั้นจึงเข้าถึงได้ง่ายจากโค้ดจาวา

แต่คุณสามารถเพิ่มคำอธิบายประกอบลงในโค้ด kotlin ของคุณเพื่อให้ง่ายต่อการเปิดเผยจากโค้ดจาวา

คำอธิบายประกอบเป็นวิธีการแนบข้อมูลเมตากับโค้ด

เริ่มกันเลย เปิด Intellij Idea สร้างโครงการ Kotlin ใหม่ เลือกgradleสำหรับโครงการ

หากคุณต้องการเพิ่ม รูท ซอร์สของจาวา ให้ คลิกขวาที่ ไดเร็กทอรี หลักและ เพิ่ม ไดเร็กทอรี ใหม่ เพิ่มจาวา

และตอนนี้มาเริ่มเรียนรู้เกี่ยวกับคำอธิบายประกอบที่ทำให้เข้าถึงโค้ด kotlin จาก java ได้ง่าย

@JvmStatic

สิ่งนี้ใช้เพื่ออธิบายฟิลด์และฟังก์ชันคงที่ของ kotlin เพื่อให้คุณสามารถเข้าถึงได้จากโค้ดจาวาโดยไม่จำเป็นต้องเพิ่ม คำหลัก INSTANCEหลังจากชื่อคลาส

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

สิ่งนี้ใช้เพื่อเข้าถึงฟิลด์อินสแตนซ์ในคลาสปกติ เราใช้วัตถุในตัวอย่างก่อนหน้า

แต่คุณอาจคิดถึงวิธีการเข้าถึงฟิลด์ในคลาส Kotlin ปกติ

คำตอบคือการใช้คำอธิบายประกอบ @JvmField

ก่อนจะข้ามไปที่โค้ด เรามาอธิบายวิธีการคอมไพล์ฟิลด์หรือคุณสมบัติ kotlin กัน

คุณสมบัติ Kotlin ถูกคอมไพล์เป็นองค์ประกอบ Java ต่อไปนี้:

  • เมธอด getter โดยมีชื่อที่คำนวณโดยการเติมgetคำนำหน้า
  • เมธอด setter โดยมีชื่อที่คำนวณโดยsetนำหน้าคำนำหน้า (เฉพาะvarคุณสมบัติ)

var firstName: String

บรรทัดนี้รวบรวมต่อไปนี้:

private String firstName;

public String getFirstName() {
    return firstName;
}

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

new ClassName().getFirstName();

ขอให้สังเกตว่าเราได้ใช้@JvmFieldover field nameเพื่อสั่งให้ Kotlin compiler ไม่สร้าง getter และ setter สำหรับสิ่งเดียวกันและเปิดเผยเป็นฟิลด์

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
        );
    }

คำอธิบายประกอบนี้บอกให้ JVM เชื่อมโยงชื่อเฉพาะกับฟังก์ชันของคุณ ซึ่งจะแทนที่ชื่อฟังก์ชันของโค้ด 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()
        );
    }
}

โดยปกติ หากคุณเขียนฟังก์ชัน Kotlin ด้วยค่าพารามิเตอร์เริ่มต้น จะมองเห็นได้ใน Java เป็นลายเซ็นแบบเต็มเท่านั้น โดยมีพารามิเตอร์ทั้งหมดแสดงอยู่ หากคุณต้องการเปิดเผยการโอเวอร์โหลดหลายครั้งแก่ผู้เรียก Java คุณสามารถใช้คำอธิบายประกอบได้@JvmOverloads

คำอธิบายประกอบยังใช้ได้กับตัวสร้าง วิธีแบบสแตติก และอื่นๆ ไม่สามารถใช้กับวิธีการแบบนามธรรม รวมถึงวิธีการที่กำหนดไว้ในส่วนต่อประสาน

ดังนั้นคำอธิบายประกอบนี้ใช้เพื่อระบุพารามิเตอร์เริ่มต้นจึงสามารถข้ามจากโค้ดจาวา โดยไม่ต้องผ่านพารามิเตอร์ทั้งหมด

สิ่งนี้ใช้ได้กับตัวสร้างคลาส

คอตลิน:

@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()
        );
    }

หัวข้อนี้ได้รับแรงบันดาลใจจากบล็อกของเขา

ตรวจสอบบล็อกของเขา:https://amitshekhar.me

ข้อมูลอ้างอิง:

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

https://amitshekhar.me