2014-04-07 27 views
6

Hôm nay tôi đã tự hỏi tại sao các khung như `Hibernate sử dụng sự phản chiếu thay vì tạo mã (ví dụ sử dụng thư viện như BCEL hoặc ASM) trong quá trình biên dịch/khởi động ứng dụng.Java phản chiếu vs mã thế hệ

Có phải vì lý do lịch sử (khi Hibernate đang được viết không có sẵn thư viện nào cho phép tạo mã byte) và bây giờ mọi người sử dụng phương pháp này?

Tôi giả định rằng cách tiếp cận với mã được tạo sẽ nhanh hơn sau đó phương pháp sử dụng phản chiếu.

+1

Phản ánh không chậm, đặc biệt trong ngữ cảnh I/O - truy cập cơ sở dữ liệu/tệp sẽ chậm hơn vài lần so với hiệu suất do phản ánh. – assylias

+0

Vâng, bạn có lẽ đúng. Tôi chỉ hỏi câu hỏi này vì tôi tò mò về quyết định sử dụng sự phản chiếu. Sau nhiều năm JVM, tôi tin rằng có nhiều tối ưu hóa làm tăng tốc độ phản chiếu so với bản phát hành đầu tiên của 'Java'. – Andna

Trả lời

6

Phải, Hibernate có thể có lợi từ việc tạo mã, mặc dù lợi nhuận có thể không lớn như bạn giả sử.

  1. Trước hết, Phản ánh sử dụng thế hệ bytecode dưới mui xe và không quá chậm.
  2. Bạn không thể thực hiện một số thứ bằng cách sử dụng thế hệ bytecode. Ví dụ. sự phản chiếu cho phép bạn truy cập các trường riêng và gọi các phương thức riêng, trong khi không thể với việc tạo mã byte (trừ khi bạn sử dụng certain non-portable hacks).
+0

Quảng cáo. 1 - bạn có bất kỳ nguồn nào về điều này (tạo mã tôi có nghĩa là)? Tôi không bao giờ thực sự đọc cách phản chiếu hoạt động dưới mui xe. Tôi sẽ rất vui nếu bạn có thể chỉ cho tôi một số bài viết. Quảng cáo. 2 - đúng, điểm cho sự phản chiếu – Andna

+2

Hãy xem [Nguồn phản chiếu] (http://hg.openjdk.java.net/jdk8/jdk8/jdk/file/43cb25339b55/src/share/classes/sun/reflect) trong OpenJDK, 'MethodAccessorGenerator.java' nói riêng. Tóm lại, 'java.lang.Method' có một trình truy cập mà các truy vấn được ủy nhiệm. 15 lệnh gọi đầu tiên của 'Method.invoke()' được thực hiện thông qua một cuộc gọi riêng của JVM (xem 'NativeMethodAccessorImpl.java'). Sau đó, ngay sau khi đạt được 'sun.reflect.inflationThreshold' (15 theo mặc định), các phép tạo mã bytecode và' NativeMethodAccessorImpl' được thay thế bằng trình truy cập Java được tạo động. – apangin

+0

Cảm ơn bạn đã liên kết các nguồn có liên quan. – Andna

Các vấn đề liên quan