Vai trò của ClassLoader trong Java là gì?



Bài viết này là hướng dẫn toàn diện về cách hoạt động của ClassLoader trong Java. Nó thảo luận về các loại, nguyên tắc và phương pháp của ClassLoader trong Java.

Trong khi làm việc trong Java, chúng ta thường sử dụng một số lượng lớn các lớp. Các lớp Java này không được tải tất cả cùng một lúc trong bộ nhớ, thay vào đó, chúng được tải khi ứng dụng yêu cầu. Đây là nơi Java ClassLoaders xuất hiện trong hình. Vì vậy, trong bài viết này, tôi sẽ thảo luận về cách sử dụng ClassLoader trong Java cùng với các ví dụ.

Các chủ đề sau sẽ được đề cập trong bài viết này:





  1. ClassLoader là gì?
  2. Các loại ClassLoader
  3. Nguyên tắc của ClassLoader
  4. Phương thức của ClassLoader
  5. Trình tải lớp tùy chỉnh

Hãy để chúng tôi bắt đầu!

c ++ hàm ảo = 0

ClassLoader trong Java là gì?

ClassLoader trong Java được gọi bởi Java Runtime Environment để tải động các lớp bất cứ khi nào ứng dụng yêu cầu trong Máy ảo Java . Vì ClassLoaders là một phần của Môi trường chạy thời gian chạy Java, Máy ảo Java sẽ không có bất kỳ ý tưởng nào về các tệp và hệ thống tệp cơ bản.



Bây giờ, chúng ta hãy hiểu các loại ClassLoader tích hợp sẵn khác nhau trong Java.

Các loại ClassLoader trong Java

Các loại ClassLoader khác nhau trong Java như sau:

Hãy để chúng tôi thảo luận về từng cái một.



Extension ClassLoader

Như tên cho thấy, Extension ClassLoader tải các phần mở rộng của các lớp Java lõi từ JDK Thư viện mở rộng. Nó là con của Bootstrap ClassLoader và tải các phần mở rộng từ thư mục JRE / lib / text hoặc bất kỳ thư mục nào khác được chỉ định trong thuộc tính hệ thống java.ext.dirs.

Application hoặc System ClassLoader

Ứng dụng hoặc Trình tải lớp hệ thống là con của Trình tải lớp mở rộng. Loại ClassLoader này tải tất cả các lớp cấp ứng dụng được tìm thấy trong tùy chọn dòng lệnh -cp hoặc trong biến môi trường CLASSPATH.

Bootstrap ClassLoader

Như chúng ta đều biết rằng Các lớp Java được tải bởi một phiên bản của java.lang.ClassLoade. Tuy nhiên, vì ClassLoader là các lớp, nên Bootstrap ClassLoader có trách nhiệm tải các lớp bên trong JDK. BootStrap ClassLoader là một mã máy bắt đầu hoạt động khi JVM gọi nó và tải các lớp từ rt.jar. Vì vậy, bạn có thể hiểu rằng Bootstrap ClassLoader phục vụ không có ClassLoader mẹ và do đó được gọi là Primordial ClassLoader.

Ghi chú: Mức độ ưu tiên của Bootstrap cao hơn Phần mở rộng và mức độ ưu tiên dành cho Trình tải lớp mở rộng cao hơn Trình tải lớp ứng dụng. Tham khảo hình ảnh bên dưới:

Các loại ClassLoader - ClassLoader trong Java - Edureka

Tiếp theo trong bài viết này, chúng ta hãy hiểu các nguyên tắc hoạt động của ClassLoader.

Nguyên tắc của ClassLoader trong Java

Tập hợp các quy tắc mà Java ClassLoader hoạt động dựa trên ba nguyên tắc sau:

Hãy để chúng tôi hiểu từng người trong số họ.

Thuộc tính Duy nhất

Thuộc tính này đảm bảo rằng không có sự lặp lại của các lớp và tất cả các lớp là duy nhất. Thuộc tính duy nhất cũng đảm bảo rằng các lớp được tải bởi ClassLoader mẹ không được tải bởi ClassLoader con. Trong một kịch bản, nơi mà ClassLoader cha không thể tìm thấy lớp, thì cá thể hiện tại sẽ cố gắng tự làm điều đó.

Mô hình ủy quyền

ClassLoader trong Java hoạt động dựa trên tập hợp các hoạt động do Mô hình ủy quyền đưa ra. Vì vậy, bất cứ khi nào một yêu cầu được tạo ra để tìm một lớp hoặc một tài nguyên, thì một cá thể ClassLoader sẽ ủy quyền tìm kiếm lớp hoặc tài nguyên đó cho ClassLoader mẹ.

Tập hợp các hoạt động dựa trên ClassLoader hoạt động như sau:

  • Máy ảo Java kiểm tra xem lớp có được tải hay không, bất cứ khi nào nó gặp một lớp.
  • Trong trường hợp lớp được tải JVM tiến hành thực thi lớp, nhưng trong trường hợp lớp không được tải, thìJVM yêu cầu hệ thống con Java ClassLoader tải lớp cụ thể đó. Sau đó, hệ thống con ClassLoader cấp quyền điều khiển cho Application ClassLoader.
  • Sau đó, Application ClassLoader sẽ ủy quyền yêu cầu cho Extension ClassLoader, sau đó sẽ chuyển yêu cầu đến Bootstrap ClassLoader.
  • Bây giờ, Bootstrap ClassLoader tìm kiếm trongBootstrap classpath để kiểm tra xem lớp có sẵn hay không. Nếu lớp có sẵn, thì nó sẽ được tải, nếu không thì yêu cầu lại được chuyển đến Extension ClassLoader.
  • Extension ClassLoader kiểm tra lớp trong classpath của phần mở rộng.Nếu lớp có sẵn, thì nó sẽ được tải, nếu không thì yêu cầu lại được chuyển đến Application ClassLoader.
  • Cuối cùng, Application ClassLoader tìm kiếm lớp trong classpath ứng dụng.Nếu lớp có sẵn, sau đó được tải, nếu không, bạn sẽ thấy một ngoại lệ của ClassNotFoundException.

Tham khảo hình ảnh bên dưới.

Nguyên tắc hiển thị

Theo nguyên tắc này, các lớp con hiển thị với các lớp được tải bởi ClassLoader cha của nó, nhưng ngược lại thì không đúng. Vì vậy, các lớp được nạp bởi Application ClassLoader có khả năng hiển thị trong các lớp được nạp bởi Extension và Bootstrap ClassLoader.

Ví dụ: nếu chúng ta có hai lớp: A & B, giả sử rằng lớp A được nạp bởi Application ClassLoader và lớp B được nạp bởi Extensions ClassLoader. Ở đây, các lớp A và B được hiển thị cho tất cả các lớp được nạp bởi Application ClassLoader, nhưng lớp B chỉ hiển thị với những lớp được nạp bởi Extension ClassLoader.

Ngoài ra, nếu bạn cố gắng tải các lớp này bằng Bootstrap ClassLoader, bạn sẽ thấy java.lang.ClassNotFoundException . ngoại lệ.

cách sử dụng gói trong java

Được rồi, bây giờ bạn đã biết các loại ClassLoader và nguyên tắc đằng sau nó, chúng ta hãy xem xét một số phương pháp quan trọngtừ java.lang.ClassLoader lớp học.

Phương thức của ClassLoader trong Java

Ít cần thiết của ClassLoader như sau:

loadClass (Tên chuỗi, phân giải boolean)

Phương thức này là điểm vào của ClassLoader và được sử dụng để tải lớp được tham chiếu bởi JVM. Nó lấy tên của như một tham số. JVM gọi phương thức loadClass () để giải quyết các tham chiếu lớp bằng cách đặt giá trị boolean thành true. Chỉ khi chúng ta cần xác định xem lớp có tồn tại hay không, tham số boolean được đặt thành false.

Tờ khai:

public Class loadClass (Tên chuỗi, phân giải boolean) ném ClassNotFoundException {

defineClass ()

Một phương thức cuối cùng được sử dụng để xác định một mảng byte như một thể hiện của một lớp. Trong trường hợp lớp đó không hợp lệ, nó sẽ ném ra một ClassFormatError.

Tờ khai:

được bảo vệ cuối cùng Class defineClass (String name, byte [] b, int off, int len) ném ClassFormatError

findClass (Tên chuỗi)

Phương thức findClass được sử dụng để tìm lớp được chỉ định. Vì vậy, nó chỉ tìm thấy lớp có tên đủ điều kiện làm tham số nhưng không tải lớp đó. Phương thức loadClass () gọi phương thức này nếu ClassLoader cha không thể tìm thấy lớp được yêu cầu. Ngoài ra, nếu không có cha mẹ nào của ClassLoader tìm thấy lớp, việc triển khai mặc định sẽ ném ClassNotFoundException.

Tờ khai:

Lớp được bảo vệ findClass (Tên chuỗi) ném ClassNotFoundException

Class.forName (Tên chuỗi, khởi tạo boolean, trình nạp ClassLoader)

Phương thức này được sử dụng để tải và khởi tạo lớp. Nó cung cấp một tùy chọn để chọn bất kỳ ClassLoader nào và trong trường hợp tham số ClassLoader là NULL, thì tự động Bootstrap ClassLoader được sử dụng.

Tờ khai:

public static Class forName (Tên chuỗi, khởi tạo boolean, trình nạp ClassLoader) ném ClassNotFoundException

getParent ()

Phương thức getParent được sử dụng để trả về ClassLoader cha để ủy quyền.

Tờ khai:

public Final ClassLoader getParent ()

getResource ()

Như tên cho thấy, phương thức getResource () đã cố gắng tìm một tài nguyên với tên đã cho. Ban đầu, nó sẽ ủy quyền yêu cầu cho ClassLoader cha đối với tài nguyên. Trong trường hợp giá trị gốc là null, thì đường dẫn của ClassLoader được tích hợp trong JVM sẽ được tìm kiếm. Bây giờ, nếu điều này không thành công, thì phương thức sẽ gọi findResource (Chuỗi) để tìm tài nguyên, trong đó tên tài nguyên được chỉ định làm đầu vào có thể là classpath tuyệt đối hoặc tương đối. Sau đó, nó trả về một đối tượng URL để đọc tài nguyên hoặc trả về giá trị null nếu tài nguyên không có đủ đặc quyền để trả về tài nguyên hoặc không được tìm thấy.

Tờ khai:

URL công khai getResource (Tên chuỗi)

Tiếp theo, trong bài viết này về ClassLoader trong Java, chúng ta hãy hiểu về Custom ClassLoader.

ClassLoader tùy chỉnh trong Java

ClassLoaders tích hợp sẵn sẽ xử lý hầu hết các trường hợp tệp đã có trong hệ thống tệp, nhưng nếu bạn muốn tải các lớp ra khỏi ổ cứng cục bộ thì bạn cần sử dụng ClassLoader tùy chỉnh.

Tạo ClassLoader Tùy chỉnh

Để tạo một ClassLoader tùy chỉnh, bạn cần mở rộng ClassLoader lớp và ghi đè findClass () phương pháp:

Ví dụ: Hãy để chúng tôi tạo một ClassLoader tùy chỉnh mở rộng ClassLoader mặc định và tải một mảng byte từ tệp được chỉ định. Tham khảo mã bên dưới.

package edureka import java.io.ByteArrayOutputStream import java.io.File import java.io.IOException import java.io.InputStream public class Mẫu mở rộng ClassLoader {@Override public Class findClass (String samplename) ném ClassNotFoundException {byte [] b = customLoadClassFromFile (samplename) return defineClass (samplename, b, 0, b.length)} private byte [] customLoadClassFromFile (String demofilename) {InputStream inStream = getClass (). getClassLoader (). getResourceAsStream (demofilename.replace ('.', File. splittorChar) + '.class') byte [] đệm ByteArrayOutputStream bStream = new ByteArrayOutputStream () int nextValue = 0 try {while ((nextValue = inStream.read ())! = -1) {bStream.write (nextValue)}} catch (IOException e) {e.printStackTrace ()} buffer = bStream.toByteArray () return buffer}}

Với điều này, chúng ta kết thúc bài viết này về ClassLoader trong Java. Tôi hy vọng bạn đã hiểu ClassLoader trong Java là gì, các phương thức của nó, các loại ClassLoader khác nhau, v.v.

Nếu bạn tìm thấy bài viết này về “ClassLoader trong Java”, hãy xem của Edureka, một công ty học trực tuyến đáng tin cậy với mạng lưới hơn 250.000 người học hài lòng trải dài trên toàn cầu. Chúng tôi ở đây để giúp bạn từng bước trong hành trình của bạn, để trở thành một người ngoài câu hỏi phỏng vấn java này, chúng tôi đưa ra một chương trình giảng dạy được thiết kế cho sinh viên và các chuyên gia muốn trở thành Java Nhà phát triển.

sắp xếp mảng c ++ giảm dần

Có một câu hỏi cho chúng tôi? Vui lòng đề cập đến nó trong phần nhận xét của “ClassLoader trong Java ' và chúng tôi sẽ liên hệ lại với bạn trong thời gian sớm nhất.