0Pricing
Java Academy · บทเรียน

การสะท้อนและการกำหนดค่า

จัดการคุณลักษณะแบบไดนามิก

การสะท้อนและการกำหนดค่า เป็นบทเรียน Java Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 3 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน Java Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส Java Academy มีบทเรียนทั้งหมด 4 บทเรียน

รีเฟลกชันและการกำหนดค่า

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

ปัญหาของรีเฟลกชัน

เมื่อคุณค้นหาคลาสด้วยชื่อจากสตริง ตัววิเคราะห์จะไม่ทราบว่าคุณหมายถึงคลาสใด หากคลาสนั้นไม่สามารถเข้าถึงได้จากส่วนอื่น คลาสจะถูกตัดออกจากอิมเมจและการค้นหาจะล้มเหลวขณะทำงาน

public class Main {
    public static void main(String[] args) throws Exception {
        String name = "java.util.ArrayList"; // could come from config
        Class<?> c = Class.forName(name);
        System.out.println("Loaded: " + c.getSimpleName());
    }
}

เมทาดาทาการเข้าถึงได้

วิธีแก้คือเมทาดาทาการเข้าถึงได้ ซึ่งเป็นไฟล์เจสันที่บอก native-image ว่ามีการเข้าถึงคลาส เมธอด และฟิลด์ใดแบบไดนามิก จากนั้นการสร้างจะเก็บสิ่งเหล่านี้ไว้และบันทึกสมาชิกของสิ่งเหล่านั้น

ไฟล์กำหนดค่ารีเฟลกชัน

รายการรีเฟลกชันจะระบุชื่อคลาสและสมาชิกที่ต้องเก็บรักษา ข้อมูลตัวอย่างนี้เป็นเจสัน ไม่ใช่ Java และอยู่ใต้ META-INF/native-image/

[
  {
    "name": "com.example.Person",
    "allDeclaredConstructors": true,
    "allDeclaredMethods": true,
    "fields": [ { "name": "age" } ]
  }
]

เอเจนต์ติดตามการทำงาน

การเขียนเมทาดาทาด้วยตนเองเป็นงานที่น่าเบื่อ ให้เรียกใช้แอปของคุณบน JVM พร้อมเอเจนต์ติดตามการทำงาน (-agentlib:native-image-agent=config-output-dir=...) เอเจนต์จะบันทึกการเข้าถึงแบบไดนามิกทุกครั้งระหว่างการทำงานจริง และสร้างไฟล์กำหนดค่าให้อัตโนมัติ

ทดสอบเส้นทางการทำงานของโค้ด

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

พร็อกซีแบบไดนามิก

พร็อกซีแบบไดนามิกของ JDK ต้องใช้ proxy-config.json ซึ่งแสดงรายการชุดอินเทอร์เฟซที่ถูกสร้างเป็นพร็อกซี ตัววิเคราะห์ไม่สามารถอนุมานข้อมูลเหล่านี้ได้ เพราะรายการอินเทอร์เฟซถูกรวบรวมขึ้นขณะทำงาน

ทรัพยากร

ไฟล์ที่โหลดผ่าน getResourceAsStream จะไม่ถูกฝังไว้โดยอัตโนมัติ resource-config.json ที่มีรูปแบบโกลบบอก native-image ว่าต้องรวมทรัพยากรใดไว้ในไฟล์ปฏิบัติการ

public class Main {
    public static void main(String[] args) {
        var url = Main.class.getResource("/banner.txt");
        System.out.println("Resource present: " + (url != null));
    }
}

การทำอนุกรมและ JNI

การทำอนุกรมของ Java และการเรียกใช้โค้ดเนทีฟ (JNI) ก็เป็นการทำงานแบบไดนามิกเช่นกัน แต่ละอย่างมีไฟล์กำหนดค่าเป็นของตนเอง (serialization-config.json, jni-config.json) เอเจนต์ติดตามการทำงานจะสร้างไฟล์เหล่านี้ด้วยเมื่อเส้นทางดังกล่าวถูกเรียกใช้

การลงทะเบียนโดยใช้โค้ด

ผู้เขียนไลบรารีสามารถลงทะเบียนเมทาดาทาในโค้ดโดยใช้ Feature ผ่าน API RuntimeReflection ซึ่งทำงานในเวลาสร้าง วิธีนี้ทำให้ไลบรารีมีการกำหนดค่าที่ถูกต้องอยู่ภายใน ผู้ใช้จึงไม่ต้องตั้งค่าด้วยตนเอง

คลังเมทาดาทาที่ใช้ร่วมกัน

GraalVM ดูแลคลังเมทาดาทาการเข้าถึงได้ของชุมชน ซึ่งมีการกำหนดค่าที่สร้างไว้ล่วงหน้าสำหรับไลบรารียอดนิยม เครื่องมือสร้างเนทีฟสามารถดึงข้อมูลจากคลังนี้โดยอัตโนมัติ ทำให้เฟรมเวิร์กทั่วไปใช้งานได้ทันที

ตรวจสอบความเข้าใจ

ทดสอบความเข้าใจของคุณเกี่ยวกับความสามารถแบบไดนามิกในอิมเมจเนทีฟ

ทบทวน

คุณได้เรียนรู้วิธีจัดการความสามารถแบบไดนามิก:

  • รีเฟลกชัน พร็อกซี ทรัพยากร การทำอนุกรม และ JNI มองไม่เห็นได้จากการวิเคราะห์แบบสแตติก
  • ไฟล์เจสันเมทาดาทาการเข้าถึงได้ใช้ประกาศความสามารถเหล่านี้ให้ native-image ทราบ
  • เอเจนต์ติดตามการทำงานสร้างการกำหนดค่าโดยอัตโนมัติจากการทำงานจริงบน JVM
  • ทดสอบเส้นทางการทำงานของโค้ดทั้งหมด โดยเฉพาะการทดสอบ เพื่อไม่ให้ตกหล่นสิ่งใด
  • ใช้คลังเมทาดาทาที่ใช้ร่วมกันสำหรับไลบรารียอดนิยม

คำถามที่พบบ่อย

บทเรียน “การสะท้อนและการกำหนดค่า” ฟรีหรือไม่

ใช่ — ข้อความเต็มของ “การสะท้อนและการกำหนดค่า” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส Java Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส Java Academy มีบทเรียนทั้งหมด 4 บทเรียน

คุณจะเรียนรู้อะไรในบทเรียน “การสะท้อนและการกำหนดค่า”

จัดการคุณลักษณะแบบไดนามิก คุณปฏิบัติ Java Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน

คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน Java Academy หรือไม่

ไม่จำเป็นต้องมีประสบการณ์มาก่อน Java Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 3 จากทั้งหมด 4 บทเรียน

บทเรียน “การสะท้อนและการกำหนดค่า” ใช้เวลานานแค่ไหน

บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย

ฉันเขียนและรันโค้ดในบทเรียน Java Academy นี้ได้ไหม

ได้ บทเรียน Java Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. GraalVM คืออะไร
  2. การสร้างอิมเมจเนทีฟ
  3. การสะท้อนและการกำหนดค่า
  4. ข้อแลกเปลี่ยนของอิมเมจเนทีฟ
← กลับไปที่ Java Academy