cuốn sách gpt4 ai đã làm

Ba loại tư thế tải

In lại Tác giả: Người biết Thời gian cập nhật: 2024-03-12 23:33:35 28 4
mua khóa gpt4 Nike

Ba loại phương pháp tải

Ba phương thức tải lớp phổ biến như sau:

TransactionMain giao dịchMain = new TransactionMain(); Lớp aClass = Class.forName(TransactionMain.class.getName()); ClassLoader.getSystemClassLoader().loadClass(TransactionMain.class.getName());

Vì vậy, câu hỏi sau đây được đặt ra: Sự khác biệt giữa ba phương pháp tải này là gì?

Để trả lời câu hỏi trên, trước tiên chúng ta hãy xem các bước mà tệp java.class trải qua khi được tải từ đĩa vào bộ nhớ.

  • Giai đoạn tải là tải tệp lớp từ đĩa vào bộ nhớ và tạo đối tượng lớp tương ứng với tệp lớp.

  • Giai đoạn kết nối bao gồm ba bước nhỏ:

  • Xác minh: Đảm bảo rằng thông tin chứa trong luồng byte của tệp Lớp tuân thủ đặc tả máy ảo Java và thực hiện xác minh định dạng tệp, siêu dữ liệu, mã byte và tham chiếu ký hiệu, v.v.

  • Chuẩn bị: Cấp phát bộ nhớ cho các biến tĩnh trong lớp và đặt nó về giá trị 0 của kiểu dữ liệu hiện tại, ví dụ: static int a=10, nhưng ở đây chỉ gán giá trị 0, tức là a=0

  • Phân tích cú pháp: Thay thế các tham chiếu ký hiệu trong nhóm hằng số bằng các tham chiếu trực tiếp

  • Khởi tạo: Thực thi mã trong hàm tạo của lớp. Phương thức client của hàm tạo lớp ở đây là trình biên dịch tự động thu thập các hành động gán của tất cả các biến tĩnh trong lớp và hợp nhất các câu lệnh trong khối câu lệnh tĩnh. Tại đây a sẽ được gán một giá trị. của 10 .

Để biết chi tiết về việc tải lớp, vui lòng tham khảo bài viết này

sự khác biệt

  • Trình nạp lớp được sử dụng bởi từ khóa new và Class.forName giống nhau, cả hai đều là trình nạp lớp hiện tại, tức là trình tải ngữ cảnh ứng dụng
  • Phương thức classLoader.loadClass() được tải bởi trình nạp lớp do người dùng chỉ định. Nếu bạn cần truy vấn và tải các lớp trong đường dẫn lớp hiện tại, bạn chỉ có thể sử dụng phương thức này.

Một điều nữa: hai phương thức đầu tiên là tải tĩnh, trong khi phương thức cuối cùng là tải động

  • Trong quá trình tải tĩnh, nếu không thể tìm thấy lớp được khởi tạo trong môi trường đang chạy, NoClassDefFoundError sẽ bị ném ra, đây là Lỗi trong hệ thống ngoại lệ JAVA;
  • Trong quá trình tải động, nếu không thể tìm thấy lớp được khởi tạo trong môi trường đang chạy, ClassNotFoundException sẽ bị ném ra, đây là một ngoại lệ trong hệ thống ngoại lệ JAVA.
    đã kiểm traException.
    Từ góc độ JVM, khi chúng ta sử dụng từ khóa new để tạo một lớp, lớp đó có thể không được tải. Nhưng khi sử dụng phương thức newInstance() của đối tượng Class, bạn phải đảm bảo rằng: 1. Lớp này đã được tải 2. Lớp này đã được kết nối;

Sự khác biệt giữa từ khóa mới và phương thức newInstance():

newInstance: loại yếu, không hiệu quả, chỉ có thể gọi các cấu trúc không có đối số; mới: loại mạnh, tương đối hiệu quả, có thể gọi bất kỳ cấu trúc Public nào.

Sự khác biệt giữa Class.forName và ClassLoader.loadClass

Tải lớp bao gồm 3 bước: tải, liên kết và khởi tạo. Điều này đã được đề cập ở trên.

Class.forName(className)thực sự gọiClass.forName(className, true, this.getClass().getClassLoader()).

Tham số thứ hai đề cập đến việc Lớp có phải được khởi tạo sau khi được tải hay không.

ClassLoader.loadClass(className)Những gì thực sự được gọi làClassLoader.loadClass(tên, sai).

Tham số thứ hai đề cập đến việc Lớp có được liên kết hay không

Lớp được tải bởi Class.forName(className) đã được khởi tạo, nhưng lớp được tải bởi ClassLoader.loadClass(className) chưa được liên kết.

Trong trường hợp bình thường, hai phương thức này có tác dụng như nhau và có thể tải Class. Nhưng nếu chương trình phụ thuộc vào việc Lớp có được khởi tạo hay không thì phải sử dụng Class.forName(name).

Ví dụ, trong lập trình JDBC, bạn thường thấy cách sử dụng như thế này:

Class.forName("com.mysql.jdbc.Driver")

Nếu bạn thay đổi nó thành như sau, nó sẽ không hoạt động.

getClass().getClassLoader().loadClass("com.mysql.jdbc.Driver")

Bởi vì khối mã tĩnh của Driver cần được thực thi trong quá trình khởi tạo, để nó có thể tự đăng ký với DriverManager.

static { try { DriverManager.registerDriver(new Driver()); } Catch (SQLException var1) { ném RuntimeException mới("Không thể đăng ký trình điều khiển!" } });
28 4 0
Chứng chỉ ICP Bắc Kinh số 000000
Hợp tác quảng cáo: 1813099741@qq.com 6ren.com
Xem sitemap của VNExpress