การประมวลผลคำอธิบายประกอบขณะทำงาน
อ่านคำอธิบายประกอบขณะทำงานด้วยรีเฟลกชัน เพื่อใช้งานตรรกะการตรวจสอบ การกำหนดเส้นทาง หรือการแทรก
การประมวลผลคำอธิบายประกอบขณะทำงาน เป็นบทเรียน 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. ValidisAnnotationPresent
ใช้ 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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- การกำหนดคำอธิบายประกอบ: องค์ประกอบและค่าเริ่มต้น
- นโยบายการคงอยู่และชนิดเป้าหมาย
- การประมวลผลคำอธิบายประกอบขณะทำงาน
- ตัวประมวลผลคำอธิบายประกอบขณะคอมไพล์