การตรวจสอบคลาสด้วยรีเฟลกชัน
ดึงออบเจ็กต์ Class และตรวจสอบฟิลด์ เมธอด ตัวสร้าง และคำอธิบายประกอบขณะทำงาน
การตรวจสอบคลาสด้วยรีเฟลกชัน เป็นบทเรียน Java Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 1 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน Java Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส Java Academy มีบทเรียนทั้งหมด 4 บทเรียน
รีเฟลกชันคืออะไร
รีเฟลกชันช่วยให้โปรแกรม Java ตรวจสอบและจัดการโครงสร้างของตนเองขณะรันไทม์ได้ เช่น อ่านชื่อคลาส ฟิลด์ เมธอด คอนสตรักเตอร์ และแอนโนเทชัน โดยไม่จำเป็นต้องทราบข้อมูลเหล่านี้ขณะคอมไพล์
การรับออบเจ็กต์ Class
รับออบเจ็กต์ Class<?> ได้จากลิเทอรัล getClass() หรือ Class.forName()
Class<String> c1 = String.class; // literal
Class<?> c2 = "hello".getClass(); // from instance
Class<?> c3 = Class.forName("java.util.ArrayList"); // by nameการตรวจสอบข้อมูลเมทาดาทาของ Class
ดึงชื่อคลาส แพ็กเกจ คลาสแม่ และอินเทอร์เฟซที่นำไปใช้จากออบเจ็กต์ Class
Class<?> c = ArrayList.class;
System.out.println(c.getName()); // java.util.ArrayList
System.out.println(c.getSimpleName()); // ArrayList
System.out.println(c.getSuperclass()); // class java.util.AbstractList
for (Class<?> iface : c.getInterfaces()) System.out.println(iface.getName());การแสดงรายการฟิลด์ที่ประกาศไว้
getDeclaredFields() ส่งคืนฟิลด์ทั้งหมดที่ประกาศในคลาส รวมถึงฟิลด์ private ส่วน getFields() ส่งคืนเฉพาะฟิลด์ public รวมถึงฟิลด์ที่สืบทอดมา
for (Field f : User.class.getDeclaredFields()) {
System.out.printf("%-10s %s%n", f.getType().getSimpleName(), f.getName());
}การแสดงรายการเมธอด
getDeclaredMethods() แสดงรายการเมธอดทั้งหมดโดยไม่คำนึงถึงระดับการเข้าถึง ใช้ getMethods() สำหรับเมธอด public รวมถึงเมธอดที่สืบทอดมา
for (Method m : String.class.getDeclaredMethods()) {
System.out.println(m.getName() + " -> " + m.getReturnType().getSimpleName());
}การตรวจสอบพารามิเตอร์ของ Method
ดึงชนิดและชื่อของพารามิเตอร์ รวมถึงแอนโนเทชัน โดยการรับชื่อต้องใช้แฟล็กคอมไพเลอร์ -parameters
Method m = UserService.class.getDeclaredMethod("findById", Long.class);
for (Parameter p : m.getParameters()) {
System.out.println(p.getType().getSimpleName() + " " + p.getName());
}การแสดงรายการคอนสตรักเตอร์
ตรวจสอบคอนสตรักเตอร์ได้เช่นเดียวกับเมธอด getDeclaredConstructors() จะรวมคอนสตรักเตอร์ private ซึ่งมักใช้กับซิงเกิลตันหรือเครื่องมือสร้างออบเจ็กต์
for (Constructor<?> c : User.class.getDeclaredConstructors()) {
System.out.println(Arrays.toString(c.getParameterTypes()));
}การอ่านแอนโนเทชัน
ดึงแอนโนเทชันของคลาส เมธอด หรือฟิลด์ ตรวจสอบการมีอยู่ด้วย isAnnotationPresent และรับค่าด้วย getAnnotation
@RestController
@RequestMapping("/users")
public class UserController {}
// Inspection:
RequestMapping rm = UserController.class.getAnnotation(RequestMapping.class);
if (rm != null) System.out.println("Path: " + Arrays.toString(rm.value()));การตรวจสอบตัวปรับแต่ง
ใช้ Modifier.isPublic(), isStatic(), isFinal() และอื่น ๆ กับตัวปรับแต่งของฟิลด์ เมธอด หรือคลาส เพื่อกรองตามระดับการมองเห็น
for (Field f : User.class.getDeclaredFields()) {
int mod = f.getModifiers();
if (Modifier.isPrivate(mod)) System.out.println("private: " + f.getName());
}การตรวจสอบ isAssignableFrom และความเข้ากันได้ของชนิด
ใช้ Class.isAssignableFrom() เพื่อตรวจสอบความเข้ากันได้ของชนิดโดยใช้โปรแกรม ซึ่งเทียบเท่ากับ instanceof แต่ใช้กับออบเจ็กต์คลาสที่ทราบได้เฉพาะขณะรันไทม์
Class<?> parent = Collection.class;
Class<?> child = ArrayList.class;
System.out.println(parent.isAssignableFrom(child)); // true
System.out.println(child.isAssignableFrom(parent)); // falseข้อควรระวังด้านประสิทธิภาพ
รีเฟลกชันช้ากว่าโค้ดโดยตรงประมาณ 10–50 เท่าสำหรับการเข้าถึงฟิลด์หรือเมธอดแบบง่าย ควรแคชออบเจ็กต์ Field และ Method เรียก setAccessible(true) เพียงครั้งเดียวแล้วนำกลับมาใช้ซ้ำ
private static final Field NAME_FIELD;
static {
try { NAME_FIELD = User.class.getDeclaredField("name"); NAME_FIELD.setAccessible(true); }
catch (NoSuchFieldException e) { throw new RuntimeException(e); }
}ตรวจสอบความเข้าใจ
เมธอดใดส่งคืนฟิลด์ private ของคลาส แต่ไม่รวมฟิลด์ที่สืบทอดมา
สรุป
รับ Class ผ่านลิเทอรัลหรือ forName() ใช้ getDeclaredFields/Methods/Constructors เพื่อตรวจสอบสมาชิกทุกระดับการเข้าถึง อ่านแอนโนเทชันด้วย getAnnotation และแคชออบเจ็กต์รีเฟลกชันเพื่อเพิ่มประสิทธิภาพ
คำถามที่พบบ่อย
บทเรียน “การตรวจสอบคลาสด้วยรีเฟลกชัน” ฟรีหรือไม่
ใช่ — ข้อความเต็มของ “การตรวจสอบคลาสด้วยรีเฟลกชัน” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส Java Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส Java Academy มีบทเรียนทั้งหมด 4 บทเรียน
คุณจะเรียนรู้อะไรในบทเรียน “การตรวจสอบคลาสด้วยรีเฟลกชัน”
ดึงออบเจ็กต์ Class และตรวจสอบฟิลด์ เมธอด ตัวสร้าง และคำอธิบายประกอบขณะทำงาน คุณปฏิบัติ Java Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน
คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน Java Academy หรือไม่
ไม่จำเป็นต้องมีประสบการณ์มาก่อน Java Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 1 จากทั้งหมด 4 บทเรียน
บทเรียน “การตรวจสอบคลาสด้วยรีเฟลกชัน” ใช้เวลานานแค่ไหน
บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย
ฉันเขียนและรันโค้ดในบทเรียน Java Academy นี้ได้ไหม
ได้ บทเรียน Java Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- การตรวจสอบคลาสด้วยรีเฟลกชัน
- การเรียกใช้เมธอดและการเข้าถึงฟิลด์
- พร็อกซีแบบไดนามิกด้วย InvocationHandler
- ประสิทธิภาพของรีเฟลกชันและทางเลือกอื่น