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

การประมวลผลคำอธิบายประกอบขณะทำงาน

อ่านคำอธิบายประกอบขณะทำงานด้วยรีเฟลกชัน เพื่อใช้งานตรรกะการตรวจสอบ การกำหนดเส้นทาง หรือการแทรก

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

การอ่านแอนโนเทชันระดับคลาส

ดึงแอนโนเทชันจากคลาสด้วย Class.getAnnotation() (รายการเดียว) หรือ getAnnotations() (ทั้งหมด) โดยจะคืนค่า null หากไม่มีแอนโนเทชันนั้น

@Service
@RequestMapping("/api")
public class UserController {}

RequestMapping rm = UserController.class.getAnnotation(RequestMapping.class);
if (rm != null) System.out.println(Arrays.toString(rm.value())); // ["/api"]

การอ่านแอนโนเทชันของเมธอด

รับแอนโนเทชันของเมธอดผ่าน method.getAnnotation() และวนซ้ำผ่าน getDeclaredMethods() เพื่อสแกนเมธอดทั้งหมดในคลาส

for (Method m : UserController.class.getDeclaredMethods()) {
    GetMapping gm = m.getAnnotation(GetMapping.class);
    if (gm != null) System.out.println(m.getName() + " -> " + Arrays.toString(gm.value()));
}

การอ่านแอนโนเทชันของฟิลด์

เฟรมเวิร์กสำหรับตรวจสอบความถูกต้องและ ORM ใช้แอนโนเทชันของฟิลด์ ให้วนซ้ำผ่าน getDeclaredFields() และตรวจสอบแอนโนเทชันที่เกี่ยวข้องแต่ละรายการ

for (Field f : User.class.getDeclaredFields()) {
    Column col = f.getAnnotation(Column.class);
    if (col != null) System.out.println(f.getName() + " -> column: " + col.name());
}

การอ่านแอนโนเทชันของพารามิเตอร์

แอนโนเทชันของพารามิเตอร์เข้าถึงได้ผ่าน method.getParameterAnnotations() ซึ่งคืนค่าเป็นอาร์เรย์สองมิติ (หนึ่งแถวต่อพารามิเตอร์ และหนึ่งรายการต่อแอนโนเทชัน)

Method m = UserController.class.getDeclaredMethod("create", UserDto.class);
Annotation[][] pa = m.getParameterAnnotations();
for (Annotation a : pa[0]) System.out.println(a.annotationType().getSimpleName()); // e.g. Valid

isAnnotationPresent

ใช้ isAnnotationPresent(AnnotationType.class) เพื่อตรวจสอบอย่างรวดเร็วและปลอดภัยจากค่า null ก่อนอ่านค่าของแอนโนเทชัน

if (m.isAnnotationPresent(Transactional.class)) {
    beginTransaction();
    m.invoke(target, args);
    commitTransaction();
}

การสร้างคอนเทนเนอร์ฉีดการพึ่งพาอย่างง่าย

สแกนแพ็กเกจเพื่อค้นหาคลาสที่มี @Component สร้างอินสแตนซ์ผ่านรีเฟล็กชัน และจัดเก็บไว้ในแมป ซึ่งเป็นคอนเทนเนอร์ Spring แบบง่าย

Map<Class<?>, Object> beans = new HashMap<>();
for (Class<?> cls : scanPackage("com.example")) {
    if (cls.isAnnotationPresent(Component.class)) {
        beans.put(cls, cls.getDeclaredConstructor().newInstance());
    }
}

การฉีดฟิลด์ที่มี @Inject

หลังจากสร้างบีนแล้ว ให้สแกนหาฟิลด์ที่มี @Inject และกำหนดค่าให้ฟิลด์เหล่านั้นด้วยรีเฟล็กชัน เพื่อจำลองการฉีดฟิลด์

for (Object bean : beans.values()) {
    for (Field f : bean.getClass().getDeclaredFields()) {
        if (f.isAnnotationPresent(Inject.class)) {
            f.setAccessible(true);
            f.set(bean, beans.get(f.getType()));
        }
    }
}

การตรวจสอบขณะรันไทม์ด้วยค่าแอนโนเทชัน

อ่านค่าของแอนโนเทชันข้อจำกัด (เช่น @Range(min=1, max=100)) แล้วตรวจสอบค่าของฟิลด์ให้สอดคล้องกับข้อจำกัดเหล่านั้นขณะรันไทม์

for (Field f : dto.getClass().getDeclaredFields()) {
    Range range = f.getAnnotation(Range.class);
    if (range != null) {
        f.setAccessible(true);
        int val = (int) f.get(dto);
        if (val < range.min() || val > range.max())
            throw new ValidationException(f.getName() + " out of range");
    }
}

การอ่านแอนโนเทชันแบบทำซ้ำได้

สำหรับแอนโนเทชันแบบ @Repeatable ให้ใช้ getAnnotationsByType() เพื่อดึงอินสแตนซ์ทั้งหมดจากแอนโนเทชันตัวเก็บได้โดยอัตโนมัติ

Tag[] tags = MyClass.class.getAnnotationsByType(Tag.class);
for (Tag t : tags) System.out.println(t.value());

การสแกนแพ็กเกจด้วยไลบรารี ClassPath

รีเฟล็กชันมาตรฐานของ Java ไม่สามารถแสดงรายการคลาสทั้งหมดในแพ็กเกจได้ ให้ใช้ไลบรารีอย่าง Reflections, ClassGraph หรือ ClassPathScanningCandidateComponentProvider ของ Spring เพื่อสแกนรายการใน classpath

Reflections reflections = new Reflections("com.example.service");
Set<Class<?>> services = reflections.getTypesAnnotatedWith(Service.class);
services.forEach(System.out::println);

สรุปการประมวลผลแอนโนเทชันขณะรันไทม์

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

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

เมธอดใดใช้ดึงอินสแตนซ์ทั้งหมดของแอนโนเทชันแบบ @Repeatable

สรุปทบทวน

ใช้ getAnnotation/isAnnotationPresent สำหรับแอนโนเทชันรายการเดียว สแกนเมธอดและฟิลด์ด้วย getDeclared* ใช้ getAnnotationsByType สำหรับแอนโนเทชันแบบทำซ้ำได้ และประมวลผลตอนเริ่มต้นระบบพร้อมเก็บผลลัพธ์ไว้ในแคช

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

บทเรียน “การประมวลผลคำอธิบายประกอบขณะทำงาน” ฟรีหรือไม่

ใช่ — ข้อความเต็มของ “การประมวลผลคำอธิบายประกอบขณะทำงาน” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ 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. การกำหนดคำอธิบายประกอบ: องค์ประกอบและค่าเริ่มต้น
  2. นโยบายการคงอยู่และชนิดเป้าหมาย
  3. การประมวลผลคำอธิบายประกอบขณะทำงาน
  4. ตัวประมวลผลคำอธิบายประกอบขณะคอมไพล์
← กลับไปที่ Java Academy