- Tạo ứng dụng Spring Boot bằng Spring Launchizr
- Cấu hình Cassandra trong Spring Boot
- Định cấu hình nhóm kết nối Tomcat trên Spring Boot
- Định tuyến tin nhắn Camel đến Artemis được nhúng bằng WildFly
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
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
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.
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!" } });
Tôi đang sử dụng Google Cloud Datastore (không phải NDB) cho dự án của mình. python2.7 và Django. Tôi muốn tạo một mô hình mới, giả sử mô hình Tag. Thẻ lớp (db.Mo
Tôi đang xem xét việc sử dụng khả năng hiểu đơn nguyên để biểu diễn các truy vấn SQL và tạo SQL thích hợp. Thoạt nhìn, đây không phải là vấn đề, nó có vẻ rất phù hợp. Nhưng tôi phải hạn chế các loại, chúng chỉ có thể tạo thành các đơn nguyên tích chứ không phải tổng và tôi không thể nghĩ ra một
Trong tài liệu có thể gập lại, tôi thấy trường hợp sau: (Foldable f, Foldable g) => Foldable (Compose * * fg) Nếu tôi nhìn vào định nghĩa của Compose, tôi thấy rằng nó được khai báo
Đưa ra mối quan hệ đội->vận động viên và truy vấn tất cả các vận động viên. Tôi đang hiểu nhầm điều gì về tìm nạp = "Tham gia"? Việc ánh xạ này có khiến các nhóm được tải thông qua một phép nối không? Vẫn lười biếng tải các đội khi lặp lại các vận động viên. lớp công khai Ath
Tôi mới bắt đầu làm quen với khái niệm về loại, vì vậy xin vui lòng thông cảm nếu tôi diễn đạt câu hỏi của mình không tốt... Các giá trị có loại: 3::Int[1,2,3]:: [Int] ('c',True) :: (Char,Bool)
Đây là một mảng tôi có trong javascript hoạt động rất tốt! _rowData: [ { name: " Most Near", view: "recentView" }, { nam
Tôi đang cố gắng vẽ một dòng gấu trúc bằng một đường thẳng. Những dòng này tạo ra kết quả được hiển thị và biểu đồ phân tán. nhập gấu trúc dưới dạng pd print(pd.__version__) ... print(type(
Tôi đang sử dụng mô-đun gcloud npm. Cảm ơn trước. Tôi đã cố gắng rất nhiều nhưng không có gì. Câu trả lời hay nhất Bạn cần thực hiện một truy vấn trên thực thể này và tính toán kết quả. var query = ds.createQuery('EntityK
Một số bối cảnh tôi không quen lắm với libclang. Tôi vừa sửa đổi plugin vim sử dụng liên kết python thành libclang. Có một hàm python chấp nhận đối số con trỏ. C hiện tại
Tôi có một chương trình được liên kết với zlib v1.2.3 và nó báo lỗi sau: deflateEnd error 'no msg' kind: 'Z_DATA_ERROR': -3 Chương trình đã xử lý thành công nhiều tệp khác nhau cần được nén
Tôi đang cố gắng triển khai log4rs bằng cách làm theo các tài liệu. Mục tiêu của tôi là đưa kết quả của info!("INFO") vào tệp request.log, nhưng tôi gặp lỗi: thread 'main' Pank.
Loại chương trình đã có: org.apache.http.ContentTooLongException Message{kind=ERROR, text=Progr
Khi tôi thực thi ng tạo các câu hỏi thường gặp về thành phần, tôi không thể thêm thành phần mới vào dự án Nativescript của mình, nó trả về lỗi: Tùy chọn "entryComponent" is dep
Tôi là một lập trình viên xuất sắc, rất giỏi!