Computer >> Máy Tính >  >> Lập trình >> Java

Những thay đổi của trình nạp lớp trong Java 9 là gì?

Tất cả các chương trình java đều chạy trên Máy ảo Java (JVM) . Sau khi biên dịch, lớp java được chuyển đổi thành nền tảng mã bytecode không phụ thuộc vào máy và các lớp đã biên dịch được lưu trữ dưới dạng .class các tập tin. Bất cứ khi nào chúng tôi cố gắng sử dụng nó, ClassLoader tải lớp đó vào bộ nhớ. Các lớp được đưa vào môi trường Java khi chúng được tham chiếu bằng tên. Việc tải các lớp đã được thực hiện bởi trình tải lớp, khi lớp bắt đầu chạy và main () phương thức là một cách để bắt đầu lớp đó.

Có một số thay đổi nhỏ của trình nạp lớp trong Java 9:​​

  • Trình tải lớp hệ thống không còn trong Java 9, một bản sao của URLClassLoader, đúng hơn nó là một lớp nội bộ. Đây là trình tải mặc định cho các lớp trong mô-đun.
  • Trình tải lớp tiện ích mở rộng đã được đổi tên thành trình tải lớp nền tảng . Tất cả các lớp trong Nền tảng Java SE có thể được hiển thị thông qua trình tải lớp nền tảng và các lớp trong mô-đun thuộc quy trình cộng đồng Java nhưng không phải một phần của nền tảng Java SE cũng có thể hiển thị thông qua trình tải lớp nền tảng.
  • Ứng dụng không thể phụ thuộc vào trình tải lớp xác định lớp nền tảng nào của một số lớp trong Nền tảng Java SE được xác định bởi trình tải lớp nền tảng, trong khi các lớp khác được xác định bởi trình tải lớp bootstrap .
  • Nếu mã hiện tại tạo một trình tải lớp với trình tải lớp bootstrap làm trình tải lớp cha, thì chúng ta cần thay đổi để sử dụng trình tải lớp nền tảng làm trình tải mẹ.
  • Trình tải lớp nền tảng không phải là một bản sao của URLClassLoader , đúng hơn đó là một lớp nội bộ.
  • Trình tải lớp bootstrap trình tải lớp được tích hợp sẵn của JVM. Tuy nhiên, nó xác định các lớp của mô-đun quan trọng như cơ sở . Các ứng dụng được triển khai với - Xbootclasspath / a hoặc tạo trình tải lớp với null với tư cách là cha mẹ có thể cần thay đổi.

Ví dụ

public class ClassLoaderTest {
   public static void main(String args[]) {
      System.out.println("Class Loader Test");
      ClassLoaderTest test = new ClassLoaderTest();
      try {
         test.showClassLoaders();
      } catch(ClassNotFoundException cnfe) {
         System.out.println(cnfe.getMessage());
      }
   }
   public void showClassLoaders() throws ClassNotFoundException {
      System.out.println("Classloader of this class: " + ClassLoaderTest.class.getClassLoader());
      System.out.println("Classloader of Permission: " + java.sql.SQLPermission.class.getClassLoader());
      System.out.println("Classloader of LinkedList: " + java.util.LinkedList.class.getClassLoader());
      return;
   }
}

Đầu ra

Class Loader Test
Classloader of this class: jdk.internal.loader.ClassLoaders$AppClassLoader@504bae78
Classloader of Permission: jdk.internal.loader.ClassLoaders$PlatformClassLoader@299a06ac
Classloader of LinkedList: null