Động lực học lập trình Java, Phần 1: Các lớp Java và việc nạp các lớp Quan sát các lớp và những gì xảy ra khi chúng được một JVM nạp
Số trang: 13
Loại file: pdf
Dung lượng: 1.00 MB
Lượt xem: 10
Lượt tải: 0
Xem trước 2 trang đầu tiên của tài liệu này:
Thông tin tài liệu:
Dennis Sosnoski, Nhà tư vấn, Sosnoski Software Solutions, Inc. Tóm tắt: Hãy xem xét những gì xảy ra ở hậu trường về việc thực hiện ứng dụng Java của bạn trong loạt bài viết mới về các khía cạnh động của lập trình Java. Chuyên gia Java doanh nghiệp Dennis Sosnoski đưa ra tin số dẻo về định dạng lớp nhị phân Java và những gì xảy ra với các lớp bên trong JVM. Trong bài này, ông còn trình bày các vấn đề nạp lớp nằm trong phạm vi từ số lượng các lớp cần thiết để chạy một...
Nội dung trích xuất từ tài liệu:
Động lực học lập trình Java, Phần 1: Các lớp Java và việc nạp các lớp Quan sát các lớp và những gì xảy ra khi chúng được một JVM nạp Động lực học lập trình Java, Phần 1: Các lớp Java và việc nạp các lớp Quan sát các lớp và những gì xảy ra khi chúng được một JVM nạp Dennis Sosnoski, Nhà tư vấn, Sosnoski Software Solutions, Inc. Tóm tắt: Hãy xem xét những gì xảy ra ở hậu trường về việc thực hiện ứng dụng Java của bạn trong loạt bài viết mới về các khía cạnh động của lập trình Java. Chuyên gia Java doanh nghiệp Dennis Sosnoski đưa ra tin số dẻo về định dạng lớp nhị phân Java và những gì xảy ra với các lớp bên trong JVM. Trong bài này, ông còn trình bày các vấn đề nạp lớp nằm trong phạm vi từ số lượng các lớp cần thiết để chạy một ứng dụng Java đơn giản đến các xung đột trình nạp lớp, mà chúng có thể gây ra các vấn đề trong J2EE và các kiến trúc phức tạp tương tự. Bài viết này mở đầu một loạt bài viết mới trình bày một họ các chủ đề mà tôi gọi là động lực học lập trình Java. Các chủ đề gồm từ cấu trúc cơ sở của định dạng tệp lớp nhị phân Java, thông qua truy cập siêu dữ liệu trong thời gian chạy bằng cách sử dụng sự phản chiếu, tất cả các cách để sửa đổi và xây dựng các lớp mới trong thời gian chạy. Các chủ đề chung chạy xuyên suốt tất cả tài liệu này là ý tưởng trong đó việc lập trình nền tảng Java là năng động nhiều hơn làm việc với các ngôn ngữ biên dịch thẳng với mã gốc. Nếu bạn hiểu những khía cạnh năng động này, bạn có thể làm nhiều thứ với lập trình Java mà không thể khớp với bất kì ngôn ngữ lập trình chủ đạo nào khác. Trong bài viết này, tôi trình bày một số các khái niệm cơ bản làm nền tảng cho các tính năng động này của nền tảng Java. Các khái niệm này xoay quanh định dạng nhị phân được sử dụng để biểu diễn các lớp Java, gồm cả những gì sẽ xảy ra khi những lớp này được nạp vào trong JVM. Tài liệu này không chỉ cung cấp một nền móng cho phần còn lại của các bài viết trong loạt này, mà nó còn giải thích một số các mối quan tâm rất thiết thực cho các nhà phát triển đang làm việc trên nền tảng Java. Một lớp dưới dạng mã nhị phân Các nhà phát triển đang làm việc trong ngôn ngữ Java thường không phải bận tâm đến các chi tiết về những gì xảy ra với mã nguồn của họ khi nó được chạy qua trình biên dịch. Trong loạt bài này, tôi sắp trình bày rất nhiều các chi tiết ở hậu trường liên quan đến việc sẽ xảy ra từ mã nguồn để thực hiện chương trình, tuy nhiên, tôi sẽ bắt đầu xem xét tại các lớp nhị phân do một trình biên dịch tạo ra. Định dạng lớp nhị phân trên thực tế được đặc tả JVM xác định. Bình thường, từ mã nguồn của ngôn ngữ Java, một trình biên dịch tạo ra các cách biểu diễn các lớp này và chúng thường được lưu trữ trong các tệp có phần mở rộng .class. Tuy vậy, cả hai tính năng này không cần thiết. Các ngôn ngữ lập trình khác đã được phát triển có sử dụng định dạng lớp nhị phân Java và với một số mục đích, các cách biểu diễn lớp mới được xây dựng và ngay lập tức được nạp trong lúc thực hiện JVM. Đối với JVM , phần quan trọng không phải là mã nguồn hoặc cách nó được lưu trữ, mà là chính định dạng của nó. Vì vậy, trên thực tế lớp này định dạng trông như thế nào? Liệt kê 1 đưa ra các mã nguồn cho một lớp (rất) ngắn, cùng với một phần hiển thị hệ đếm mười sáu của kết quả tệp lớp của trình biên dịch: Liệt kê 1. Mã nguồn và (một phần) mã nhị phân cho tệp Hello.java public class Hello { public static void main(String[] args) { System.out.println(Hello, World!); } } 0000: cafe babe 0000 002e 001a 0a00 0600 0c09 ................ 0010: 000d 000e 0800 0f0a 0010 0011 0700 1207 ................ 0020: 0013 0100 063c 696e 6974 3e01 0003 2829 ........() 0030: 5601 0004 436f 6465 0100 046d 6169 6e01 V...Code...main. 0040: 0016 285b 4c6a 6176 612f 6c61 6e67 2f53 ..([Ljava/lang/S 0050: 7472 696e 673b 2956 0c00 0700 0807 0014 tring;)V........ 0060: 0c00 1500 1601 000d 4865 6c6c 6f2c 2057 ........Hello, W 0070: 6f72 6c64 2107 0017 0c00 1800 1901 0005 orld!........... 0080: 4865 6c6c 6f01 0010 6a61 7661 2f6c 616e Hello...java/lan 0090: 672f 4f62 6a65 6374 0100 106a 6176 612f g/Object...java/ 00a0: 6c61 6e67 2f53 7973 7465 6d01 0003 6f75 lang/System...ou ... Bên trong mã nhị phân Điều đầu tiên trong việc biểu diễn lớp nhị phân được thể hiện trong Liệt kê 1 là chữ kí quán cafe babe để xác nhận định dạng lớp nhị phân Java (và ngẫu nhiên dùng như là một -- nhưng phần lớn không được thừa nhận -- chứng cứ bền vững cho những người pha cà phê (baristas) làm việc chăm chỉ, những người giữ tinh thần cho các nhà phát triển đang xây dựng nền tảng Java). Chữ kí này là một cách dễ dàng để xác minh rằng một khối dữ liệu thực sự đưa ra yêu cầu là một cá thể của định dạng lớp Java. Mỗi lớp nhị phân Java, thậm chí một lớp không có tr ên hệ thống tệp tin đó, cần bắt đầu bằng bốn byte này. Đừng bỏ lỡ phần còn lại của loạt bài này Phần 2, Giới thiệu sự phản chiếu (June 2003) Phần 3, Ứng dụng sự phản chiếu (07.2003) Phần 4, Chuyển đổi lớp bằng Javassist (09.2003) Phần 5, Việc chuyển các lớp đang hoạt động (02.2004) Phần 6, Các thay đổi hướng-khía cạnh với Javassist (03.2004) Phần 7, Kỹ thuật bytecode với BCEL (04.2004) Phần 8, Thay thế sự phản chiếu bằng việc tạo mã (06.2004) Phần còn lại của dữ liệu ít thú vị. Sau chữ kí là một cặp các số phiên bản định dạng lớp (trong trường hợp này, phiên bản phụ 0 và phiên bản chính 46 -- hệ đếm mười sáu 0x2e -- như được tạo ra bởi các javac 1.4.1), sau đó một số đếm các lối vào trong nhóm hằng số. Số đếm lối vào (trong trường hợp 26 này hoặc 0x001a) tiếp theo là dữ liệu của nhóm hằng số thực sự. Đây là nơi lưu trữ tất cả các hằng số được sử dụng bởi các định nghĩa lớp. Nó gồm lớp và các tên phương thức, các chữ kí và các chuỗi (mà bạn có thể nhận ra trong phần giải thích bằng văn bản ở b ên phải của kết quả theo hệ đếm mười sáu), cùng với các giá trị nhị phân khác nhau. Các mục trong nhóm hằng số có chiều dài thay đổi, với byte đầu tiên của mỗi mục xác định kiểu mục và cách giải mã nó. Ta s ...
Nội dung trích xuất từ tài liệu:
Động lực học lập trình Java, Phần 1: Các lớp Java và việc nạp các lớp Quan sát các lớp và những gì xảy ra khi chúng được một JVM nạp Động lực học lập trình Java, Phần 1: Các lớp Java và việc nạp các lớp Quan sát các lớp và những gì xảy ra khi chúng được một JVM nạp Dennis Sosnoski, Nhà tư vấn, Sosnoski Software Solutions, Inc. Tóm tắt: Hãy xem xét những gì xảy ra ở hậu trường về việc thực hiện ứng dụng Java của bạn trong loạt bài viết mới về các khía cạnh động của lập trình Java. Chuyên gia Java doanh nghiệp Dennis Sosnoski đưa ra tin số dẻo về định dạng lớp nhị phân Java và những gì xảy ra với các lớp bên trong JVM. Trong bài này, ông còn trình bày các vấn đề nạp lớp nằm trong phạm vi từ số lượng các lớp cần thiết để chạy một ứng dụng Java đơn giản đến các xung đột trình nạp lớp, mà chúng có thể gây ra các vấn đề trong J2EE và các kiến trúc phức tạp tương tự. Bài viết này mở đầu một loạt bài viết mới trình bày một họ các chủ đề mà tôi gọi là động lực học lập trình Java. Các chủ đề gồm từ cấu trúc cơ sở của định dạng tệp lớp nhị phân Java, thông qua truy cập siêu dữ liệu trong thời gian chạy bằng cách sử dụng sự phản chiếu, tất cả các cách để sửa đổi và xây dựng các lớp mới trong thời gian chạy. Các chủ đề chung chạy xuyên suốt tất cả tài liệu này là ý tưởng trong đó việc lập trình nền tảng Java là năng động nhiều hơn làm việc với các ngôn ngữ biên dịch thẳng với mã gốc. Nếu bạn hiểu những khía cạnh năng động này, bạn có thể làm nhiều thứ với lập trình Java mà không thể khớp với bất kì ngôn ngữ lập trình chủ đạo nào khác. Trong bài viết này, tôi trình bày một số các khái niệm cơ bản làm nền tảng cho các tính năng động này của nền tảng Java. Các khái niệm này xoay quanh định dạng nhị phân được sử dụng để biểu diễn các lớp Java, gồm cả những gì sẽ xảy ra khi những lớp này được nạp vào trong JVM. Tài liệu này không chỉ cung cấp một nền móng cho phần còn lại của các bài viết trong loạt này, mà nó còn giải thích một số các mối quan tâm rất thiết thực cho các nhà phát triển đang làm việc trên nền tảng Java. Một lớp dưới dạng mã nhị phân Các nhà phát triển đang làm việc trong ngôn ngữ Java thường không phải bận tâm đến các chi tiết về những gì xảy ra với mã nguồn của họ khi nó được chạy qua trình biên dịch. Trong loạt bài này, tôi sắp trình bày rất nhiều các chi tiết ở hậu trường liên quan đến việc sẽ xảy ra từ mã nguồn để thực hiện chương trình, tuy nhiên, tôi sẽ bắt đầu xem xét tại các lớp nhị phân do một trình biên dịch tạo ra. Định dạng lớp nhị phân trên thực tế được đặc tả JVM xác định. Bình thường, từ mã nguồn của ngôn ngữ Java, một trình biên dịch tạo ra các cách biểu diễn các lớp này và chúng thường được lưu trữ trong các tệp có phần mở rộng .class. Tuy vậy, cả hai tính năng này không cần thiết. Các ngôn ngữ lập trình khác đã được phát triển có sử dụng định dạng lớp nhị phân Java và với một số mục đích, các cách biểu diễn lớp mới được xây dựng và ngay lập tức được nạp trong lúc thực hiện JVM. Đối với JVM , phần quan trọng không phải là mã nguồn hoặc cách nó được lưu trữ, mà là chính định dạng của nó. Vì vậy, trên thực tế lớp này định dạng trông như thế nào? Liệt kê 1 đưa ra các mã nguồn cho một lớp (rất) ngắn, cùng với một phần hiển thị hệ đếm mười sáu của kết quả tệp lớp của trình biên dịch: Liệt kê 1. Mã nguồn và (một phần) mã nhị phân cho tệp Hello.java public class Hello { public static void main(String[] args) { System.out.println(Hello, World!); } } 0000: cafe babe 0000 002e 001a 0a00 0600 0c09 ................ 0010: 000d 000e 0800 0f0a 0010 0011 0700 1207 ................ 0020: 0013 0100 063c 696e 6974 3e01 0003 2829 ........() 0030: 5601 0004 436f 6465 0100 046d 6169 6e01 V...Code...main. 0040: 0016 285b 4c6a 6176 612f 6c61 6e67 2f53 ..([Ljava/lang/S 0050: 7472 696e 673b 2956 0c00 0700 0807 0014 tring;)V........ 0060: 0c00 1500 1601 000d 4865 6c6c 6f2c 2057 ........Hello, W 0070: 6f72 6c64 2107 0017 0c00 1800 1901 0005 orld!........... 0080: 4865 6c6c 6f01 0010 6a61 7661 2f6c 616e Hello...java/lan 0090: 672f 4f62 6a65 6374 0100 106a 6176 612f g/Object...java/ 00a0: 6c61 6e67 2f53 7973 7465 6d01 0003 6f75 lang/System...ou ... Bên trong mã nhị phân Điều đầu tiên trong việc biểu diễn lớp nhị phân được thể hiện trong Liệt kê 1 là chữ kí quán cafe babe để xác nhận định dạng lớp nhị phân Java (và ngẫu nhiên dùng như là một -- nhưng phần lớn không được thừa nhận -- chứng cứ bền vững cho những người pha cà phê (baristas) làm việc chăm chỉ, những người giữ tinh thần cho các nhà phát triển đang xây dựng nền tảng Java). Chữ kí này là một cách dễ dàng để xác minh rằng một khối dữ liệu thực sự đưa ra yêu cầu là một cá thể của định dạng lớp Java. Mỗi lớp nhị phân Java, thậm chí một lớp không có tr ên hệ thống tệp tin đó, cần bắt đầu bằng bốn byte này. Đừng bỏ lỡ phần còn lại của loạt bài này Phần 2, Giới thiệu sự phản chiếu (June 2003) Phần 3, Ứng dụng sự phản chiếu (07.2003) Phần 4, Chuyển đổi lớp bằng Javassist (09.2003) Phần 5, Việc chuyển các lớp đang hoạt động (02.2004) Phần 6, Các thay đổi hướng-khía cạnh với Javassist (03.2004) Phần 7, Kỹ thuật bytecode với BCEL (04.2004) Phần 8, Thay thế sự phản chiếu bằng việc tạo mã (06.2004) Phần còn lại của dữ liệu ít thú vị. Sau chữ kí là một cặp các số phiên bản định dạng lớp (trong trường hợp này, phiên bản phụ 0 và phiên bản chính 46 -- hệ đếm mười sáu 0x2e -- như được tạo ra bởi các javac 1.4.1), sau đó một số đếm các lối vào trong nhóm hằng số. Số đếm lối vào (trong trường hợp 26 này hoặc 0x001a) tiếp theo là dữ liệu của nhóm hằng số thực sự. Đây là nơi lưu trữ tất cả các hằng số được sử dụng bởi các định nghĩa lớp. Nó gồm lớp và các tên phương thức, các chữ kí và các chuỗi (mà bạn có thể nhận ra trong phần giải thích bằng văn bản ở b ên phải của kết quả theo hệ đếm mười sáu), cùng với các giá trị nhị phân khác nhau. Các mục trong nhóm hằng số có chiều dài thay đổi, với byte đầu tiên của mỗi mục xác định kiểu mục và cách giải mã nó. Ta s ...
Tìm kiếm theo từ khóa liên quan:
lập trình java công nghệ java phát triển với java lập mô hình dịch vụ web java ngôn ngữ lập trìnhTài liệu liên quan:
-
Giáo trình Lập trình hướng đối tượng: Phần 2
154 trang 278 0 0 -
Bài thuyết trình Ngôn ngữ lập trình: Hệ điều hành Window Mobile
30 trang 270 0 0 -
Kỹ thuật lập trình trên Visual Basic 2005
148 trang 270 0 0 -
Giáo trình Lập trình cơ bản với C++: Phần 1
77 trang 233 0 0 -
Bài giảng Một số hướng nghiên cứu và ứng dụng - Lê Thanh Hương
13 trang 227 0 0 -
Giáo án Tin học lớp 11 (Trọn bộ cả năm)
125 trang 218 1 0 -
NGÂN HÀNG CÂU HỎI TRẮC NGHIỆM THIẾT KẾ WEB
8 trang 212 0 0 -
Bài tập lập trình Windows dùng C# - Bài thực hành
13 trang 188 0 0 -
Giáo trình Lập trình C căn bản: Phần 1
64 trang 170 0 0 -
Bài giảng Nhập môn về lập trình - Chương 1: Giới thiệu về máy tính và lập trình
30 trang 170 0 0