Reflection là gì? Ví dụ dễ hiểu cho tester

⏱︎

Read time:

1–2 minutes
Minh họa reflection: quan sát thuộc tính object khi chạy

Reflection trong lập trình là khả năng chương trình quan sát thông tin về object, class hoặc function khi đang chạy. Một số ngôn ngữ còn cho phép gọi method dựa trên tên vừa tìm được.

Xem object đang có gì

const student = { name: "An", active: true };
console.log(Object.keys(student)); // ["name", "active"]
const field = "name";
if (field in student) {
  console.log(student[field]); // "An"
}
Lưu ý
Tên field có thể đến từ cấu hình hoặc dữ liệu test tại thời điểm chạy. Lúc ấy chương trình mới tra cứu object; đó là điểm khác với việc viết cố định student.name.

Gọi method theo tên

class Lamp {
  turnOn(): void { console.log("Đèn đã bật"); }
}
const lamp = new Lamp();
const methodName = "turnOn";
const method = Reflect.get(lamp, methodName);
if (typeof method === "function") method.call(lamp);

Reflect.get() lấy property theo tên; getattr() là cách tương tự ở Python. Kiểm tra đó là function trước khi gọi sẽ tránh lỗi khi tên bị sai. Ở TypeScript, call(lamp) giúp method nhận đúng this.

Dùng reflection khiViết trực tiếp khi
Tên field/method chỉ được biết lúc chạyĐã biết chắc property cần dùng
Cần duyệt nhiều field để lập báo cáoChỉ có vài field cố định