Theo như tôi biết và hiểu,ngôn ngữ tĩnh và Reflection
Reflection là khả năng tạo/sửa đổi mã nguồn tại thời gian chạy.
Từ Wikipedia:
- Khám phá và sửa đổi cấu trúc mã nguồn (ví dụ như các khối mã, lớp học, phương pháp, các giao thức, vv) như là một đối tượng hạng nhất tại runtime.
- Chuyển đổi một chuỗi khớp với tên biểu tượng của một lớp hoặc chức năng thành tham chiếu đến hoặc yêu cầu lớp hoặc chức năng đó.
- Đánh giá chuỗi như thể đó là tuyên bố mã nguồn khi chạy.
Tạo một trình thông dịch mới cho bytecode của ngôn ngữ để cung cấp cho một
ý nghĩa hoặc mục đích mới để xây dựng chương trình.
Ngôn ngữ động là các ngôn ngữ mà chúng tôi có thể đánh giá (đánh giá trực tiếp từ chuỗi) tại thời gian chạy.
Từ wikipedia: "phần mở rộng của chương trình, bằng cách thêm mã mới, bằng cách mở rộng đối tượng và định nghĩa, hoặc bằng cách thay đổi hệ thống kiểu"
Ok, bây giờ, câu hỏi của tôi là: Làm thế nào tĩnh ngôn ngữ ד (không có eval khả năng) có thể có sự phản ánh (ví dụ Java)? (mã nguồn mới không được đánh giá?: /)
Cảm ơn trước!
Java có thư viện thao tác mã byte được gọi là [ASM] (http://asm.ow2.org/).Phản ánh không được sử dụng để thêm mã mới như bạn đang mô tả trong câu hỏi của mình. –
Phản ánh cho phép giả mạo (có, nó có thể có hại trong một số trường hợp) với một lớp bằng cách truy vấn về các phương thức, trường, cấp độ truy cập và như vậy nhưng _you không tạo mã mới_. Nó có các cách sử dụng khác như, ví dụ, gọi một phương thức được định nghĩa trong một lớp nào đó chỉ dựa trên dữ liệu về nó (* metadata *). Bạn nhận được một thể hiện từ một lớp, bạn sẽ có được một phương thức từ nó dựa trên công ty của nó và sau đó bạn gọi nó. – Gamb
@Gamb 10x, nhưng nếu u sửa đổi mã nguồn, do đó, u tạo mã nguồn (như wikipedia nói), phải không? – gran33