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

การตรวจสอบคลาสด้วยรีเฟลกชัน

ดึงออบเจ็กต์ 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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

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

  1. การตรวจสอบคลาสด้วยรีเฟลกชัน
  2. การเรียกใช้เมธอดและการเข้าถึงฟิลด์
  3. พร็อกซีแบบไดนามิกด้วย InvocationHandler
  4. ประสิทธิภาพของรีเฟลกชันและทางเลือกอื่น
← กลับไปที่ Java Academy