การสะท้อนและการกำหนดค่า
จัดการคุณลักษณะแบบไดนามิก
การสะท้อนและการกำหนดค่า เป็นบทเรียน 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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- GraalVM คืออะไร
- การสร้างอิมเมจเนทีฟ
- การสะท้อนและการกำหนดค่า
- ข้อแลกเปลี่ยนของอิมเมจเนทีฟ