2013-08-09 74 views
6

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!

+0

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. –

+1

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

+0

@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

Trả lời

4

Tôi nghĩ rằng giải thích wikipedia không thực sự được phân tích tốt.

Phản ánh (hoặc nội tâm) không phải là về tạo mã trong thời gian chạy mà là về khả năng mã số phản ánh trên chính nó trong thời gian chạy (và sửa đổi hành vi của nó dựa trên điều này). Ví dụ sẽ nhận được thông tin về loại đối tượng (như RTTI trong C++) hoặc nhận siêu dữ liệu được liên kết với đối tượng (như chú thích trong Java).

Tạo mã thời gian chạy có liên quan nhiều hơn đến hạng nhất so với phản ánh, vì vậy tôi cho rằng bài viết wikipedia hiện tại là loại gây hiểu lầm.

CẬP NHẬT

Nói cách khác trả lời như sau:

Ok, bây giờ, câu hỏi của tôi là, làm thế nào có thể ngôn ngữ tĩnh (không có khả năng eval) có thể có phản xạ (ví dụ Java)?

... sẽ là phản ánh không dựa vào khả năng evel. Đây là 2 tính năng ngôn ngữ riêng biệt.

Và cũng như, như Giulio Franco đã chỉ ra trong các nhận xét - Java có khả năng tạo mã thời gian chạy \ thao tác (xem CGLIB chẳng hạn).

+1

Tôi muốn thêm rằng các lớp Java được nạp vào thời gian chạy, và có một lớp Java cho phép bạn biên dịch và nạp một lớp Java một cách nhanh chóng. Vì vậy, trên thực tế, Java ** có thể ** thêm mã khi chạy. Có lẽ bạn cũng có thể loại bỏ, sửa đổi, và tải lại một lớp, nhưng tôi nghĩ rằng điều này đã có một số hạn chế (có thể bạn không thể dỡ bỏ một lớp hiện đang được sử dụng). –