Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> Java

วิธีแสดง Modules ทั้งหมดพร้อม ClassLoaders ใน Java 9

ก่อน Java 9 Extension และ Application class loader เป็น instance ของ java.net.URLClassLoader ใน Java 9 การจัดประเภท class loaders เปลี่ยนไป แทนที่ extension class loader ด้วย Platform class loader เป้าหมายคือ คลาสที่โหลดโดย bootstrap class loader จะมี permissions ทั้งหมดโดย default

ตัวอย่างโค้ด

import static java.util.Objects.isNull;

public class Java9ClassLoaderTest {
    public static void main(String args[]) {
        ModuleLayer layer = ModuleLayer.boot();
        layer.modules().forEach(module -> {
            ClassLoader classLoader = module.getClassLoader();
            String classLoaderName = isNull(classLoader) ? "bootstrap" : classLoader.getName();
            System.out.println(classLoaderName + ": " + module.getName());
        });
    }
}

ผลลัพธ์ (บางส่วน)

app: jdk.internal.ed
platform: jdk.scripting.nashorn
platform: java.compiler
platform: java.security.jgss
platform: jdk.plugin.dom
bootstrap: jdk.net
bootstrap: java.management
app: jdk.jdeps
platform: javafx.base
app: jdk.editpad
bootstrap: java.security.sasl
platform: java.sql.rowset
bootstrap: java.datatransfer
app: jdk.compiler
platform: java.scripting
platform: jdk.naming.dns
platform: jdk.crypto.mscapi
bootstrap: java.xml
platform: jdk.localedata
platform: javafx.swing
bootstrap: jdk.unsupported
platform: jdk.plugin
bootstrap: jdk.snmp
bootstrap: jdk.naming.rmi
app: jdk.internal.le
platform: javafx.web
platform: jdk.dynalink
platform: jdk.accessibility
bootstrap: java.rmi
platform: jdk.jsobject
platform: java.sql
app: jdk.attach
bootstrap: jdk.management.cmm
platform: jdk.security.auth
platform: java.xml.crypto
bootstrap: jdk.jfr
bootstrap: jdk.management.jfr
platform: jdk.security.jgss
app: jdk.packager.services
bootstrap: java.base
app: jdk.internal.opt
bootstrap: java.prefs
bootstrap: java.management.rmi
platform: jdk.zipfs
platform: java.jnlp
app: jdk.packager
platform: oracle.net
app: jdk.jlink
bootstrap: jdk.management.agent
bootstrap: java.logging
app: jdk.jdi
app: jdk.jstatd
platform: java.se
app: jdk.javadoc
platform: jdk.charsets
platform: java.smartcardio
app: jdk.jconsole
bootstrap: jdk.sctp
platform: javafx.graphics
bootstrap: jdk.management.resource
app: jdk.jdwp.agent
app: jdk.internal.jvmstat
platform: javafx.controls
platform: jdk.crypto.cryptoki
platform: javafx.media
bootstrap: jdk.httpserver
platform: oracle.desktop
bootstrap: java.naming
app: jdk.jshell
app: jdk.jartool
platform: jdk.deploy
bootstrap: java.desktop
platform: javafx.fxml
bootstrap: java.instrument
platform: jdk.crypto.ec
bootstrap: jdk.management
platform: jdk.xml.dom
platform: jdk.javaws

คำอธิบาย

  • bootstrap: โหลดโดย Bootstrap Class Loader (core modules เช่น java.base, java.xml)
  • platform: โหลดโดย Platform Class Loader (platform modules เช่น java.sql, java.xml.crypto)
  • app: โหลดโดย Application Class Loader (application modules เช่น jdk.jshell, jdk.javadoc)

โมดูลสำคัญและ Class Loader

Module Class Loader ประเภท
java.base bootstrap Core module (always present)
java.sql platform Platform module
java.desktop bootstrap Platform module (AWT/Swing)
jdk.jshell app JDK tool module
jdk.javadoc app JDK tool module
javafx.base platform JavaFX module

ประโยชน์ของการรู้ Class Loader ของแต่ละ Module

  • เข้าใจ visibility และ accessibility ระหว่าง modules
  • Debug ปัญหา ClassCastException หรือ NoClassDefFoundError
  • ออกแบบ module dependencies ให้ถูกต้อง
  • Migration จาก classpath ไป module path