Computer >> कंप्यूटर ट्यूटोरियल >  >> प्रोग्रामिंग >> Java

Java 9 में सभी मॉड्यूल्स को उनके क्लास लोडर्स के साथ प्रदर्शित करें

Java 9 का मॉड्यूल सिस्टम प्रत्येक मॉड्यूल को एक विशिष्ट क्लास लोडर से जोड़ता है: बूटस्ट्रैप, प्लेटफॉर्म, या एप्लिकेशन। यह लेख दिखाता है कि ModuleLayer API का उपयोग करके सभी मॉड्यूल्स और उनके संबंधित क्लास लोडर्स को प्रोग्रामेटिक रूप से कैसे सूचीबद्ध किया जाए।

ModuleLayer API का उपयोग करना

import java.lang.module.ModuleLayer;
import java.lang.module.ModuleReference;
import static java.util.Objects.isNull;

public class ListModulesWithClassLoaders {
    public static void main(String[] args) {
        // बूट लेयर प्राप्त करें (JVM शुरू होने पर बनाया गया)
        ModuleLayer bootLayer = ModuleLayer.boot();
        
        System.out.println("=== बूट लेयर में मॉड्यूल्स और उनके क्लास लोडर्स ===");
        System.out.printf("%-20s %s%n", "क्लास लोडर", "मॉड्यूल नाम");
        System.out.println("--------------------------------------------------");
        
        // सभी मॉड्यूल्स पर पुनरावृति करें
        bootLayer.modules().forEach(module -> {
            ClassLoader cl = module.getClassLoader();
            String clName = isNull(cl) ? "बूटस्ट्रैप" : cl.getClass().getSimpleName();
            System.out.printf("%-20s %s%n", clName, module.getName());
        });
        
        // सांख्यिकी
        long bootstrapCount = bootLayer.modules().stream()
            .filter(m -> m.getClassLoader() == null).count();
        long platformCount = bootLayer.modules().stream()
            .filter(m -> m.getClassLoader() != null 
                && m.getClassLoader().getClass().getSimpleName().contains("Platform"))
            .count();
        long appCount = bootLayer.modules().stream()
            .filter(m -> m.getClassLoader() != null 
                && m.getClassLoader().getClass().getSimpleName().contains("App"))
            .count();
        
        System.out.println("\n=== सारांश ===");
        System.out.println("कुल मॉड्यूल्स: " + bootLayer.modules().count());
        System.out.println("बूटस्ट्रैप: " + bootstrapCount);
        System.out.println("प्लेटफॉर्म: " + platformCount);
        System.out.println("एप्लिकेशन: " + appCount);
    }
}

नमूना आउटपुट

=== बूट लेयर में मॉड्यूल्स और उनके क्लास लोडर्स ===
क्लास लोडर           मॉड्यूल नाम
--------------------------------------------------
एप्लिकेशन            jdk.internal.ed
प्लेटफॉर्म           jdk.scripting.nashorn
प्लेटफॉर्म           java.compiler
प्लेटफॉर्म           java.security.jgss
प्लेटफॉर्म           jdk.plugin.dom
बूटस्ट्रैप           jdk.net
बूटस्ट्रैप           java.management
एप्लिकेशन            jdk.jdeps
प्लेटफॉर्म           javafx.base
एप्लिकेशन            jdk.editpad
बूटस्ट्रैप           java.security.sasl
प्लेटफॉर्म           java.sql.rowset
बूटस्ट्रैप           java.datatransfer
... (और अधिक)

=== सारांश ===
कुल मॉड्यूल्स: 60
बूटस्ट्रैप: 20
प्लेटफॉर्म: 25
एप्लिकेशन: 15

क्लास लोडर प्रकार समझना

क्लास लोडरविवरणउदाहरण मॉड्यूल्स
बूटस्ट्रैप (null)देशी, कोर JDK मॉड्यूल्स लोड करता हैjava.base, java.logging, jdk.management, jdk.net
प्लेटफॉर्मJava SE प्लेटफॉर्म मॉड्यूल्स + JCP मॉड्यूल्सjava.sql, java.xml, jdk.jfr, javafx.*, jdk.security.*
एप्लिकेशनएप्लिकेशन मॉड्यूल्स और क्लासपथ कक्षाएंcom.myapp, jdk.jshell, jdk.javadoc, jdk.jcmd

उन्नत: कस्टम ModuleLayer के साथ काम करना

import java.lang.module.*;
import java.nio.file.*;

public class CustomModuleLayerExample {
    public static void main(String[] args) throws Exception {
        // मॉड्यूल पथ परिभाषित करें
        Path modulePath = Path.of("mods");
        
        // मॉड्यूल फाइंडर बनाएं
        ModuleFinder finder = ModuleFinder.of(modulePath);
        
        // पैरेंट के रूप में बूट लेयर के साथ नई लेयर बनाएं
        ModuleLayer customLayer = ModuleLayer.defineModulesWithOneLoader(
            ModuleLayer.boot(), finder, (name) -> true);
        
        System.out.println("=== कस्टम लेयर मॉड्यूल्स ===");
        customLayer.modules().forEach(module -> {
            ClassLoader cl = module.getClassLoader();
            String clName = (cl == null) ? "बूटस्ट्रैप" : cl.getClass().getSimpleName();
            System.out.println(clName + ": " + module.getName());
        });
        
        // लेयर पदानुक्रम
        System.out.println("\nलेयर पदानुक्रम:");
        printLayerHierarchy(ModuleLayer.boot(), "");
    }
    
    static void printLayerHierarchy(ModuleLayer layer, String indent) {
        System.out.println(indent + "लेयर: " + layer);
        layer.modules().forEach(m -> 
            System.out.println(indent + "  " + m.getName()));
        layer.layers().forEach(child -> 
            printLayerHierarchy(child, indent + "  "));
    }
}

कमांड-लाइन विकल्प

# java --list-modules के साथ मॉड्यूल्स सूचीबद्ध करें
java --list-modules

# मॉड्यूल विवरण दिखाएं
java --describe-module java.base

# मॉड्यूल रिज़ॉल्यूशन दिखाएं
java --dry-run --module-path mods -m myapp

JShell में उपयोग

jshell> import java.lang.module.ModuleLayer
jshell> import static java.util.Objects.isNull

jshell> ModuleLayer.boot().modules().forEach(m -> {
   ...>   ClassLoader cl = m.getClassLoader();
   ...>   String name = isNull(cl) ? "बूटस्ट्रैप" : cl.getClass().getSimpleName();
   ...>   System.out.println(name + ": " + m.getName());
   ...> })
बूटस्ट्रैप: java.base
प्लेटफॉर्म: java.sql
एप्लिकेशन: jdk.jshell
...

व्यावहारिक अनुप्रयोग

  • माइग्रेशन ऑडिट: पहचानें कि कौन से मॉड्यूल किस लोडर का उपयोग करते हैं
  • क्लास लोडर लीक जांच: अप्रत्याशित एप्लिकेशन CL मॉड्यूल्स ढूंढें
  • सुरक्षा: सत्यापित करें कि संवेदनशील मॉड्यूल उचित लोडर द्वारा लोड किए गए हैं
  • डिबगिंग: NoClassDefFoundError, ClassCastException का निदान करें
  • प्रदर्शन: क्लास लोडर पदानुक्रम गहराई को समझें

महत्वपूर्ण नोट्स

  • ModuleLayer.boot() JVM शुरू होने पर बनाया गया प्राथमिक लेयर लौटाता है
  • कस्टम लेयर्स ModuleLayer.defineModules* के साथ बनाए जा सकते हैं
  • क्लास लोडर null (बूटस्ट्रैप) या आंतरिक कार्यान्वयन कक्षाएं हैं
  • क्लास लोडर कार्यान्वयन नाम (AppClassLoader, PlatformClassLoader) JDK आंतरिक हैं और बदल सकते हैं
  • नामित मॉड्यूल्स के लिए module.getClassLoader() का उपयोग करें; अनाम मॉड्यूल एप्लिकेशन CL का उपयोग करते हैं
  1. Java में JTextArea के अंदर लाइन नंबर कैसे प्रदर्शित करें? Java में JTextArea के अंदर लाइन नंबर कैसे प्रदर्शित करें?

    JTextArea JTextComponent का एक उपवर्ग है और यह एक बहु-लाइन टेक्स्ट घटक है जिसका उपयोग टेक्स्ट प्रदर्शित करने या उपयोगकर्ता को टेक्स्ट दर्ज करने की अनुमति देने के लिए किया जाता है। एक JTextArea एक CaretListener इंटरफ़ेस उत्पन्न कर सकता है, जो कैरेट अपडेट इवेंट को सुन सकता है। डिफ़ॉल्ट रूप से, JTextA

  1. Java में JLabel टेक्स्ट को अलग-अलग रंग और फ़ॉन्ट के साथ कैसे लागू करें? Java में JLabel टेक्स्ट को अलग-अलग रंग और फ़ॉन्ट के साथ कैसे लागू करें?

    JLabel एक JLabel क्लास JComponent क्लास को विस्तारित कर सकती है और JLabel का एक ऑब्जेक्ट GUI पर टेक्स्ट निर्देश या जानकारी प्रदान करता है। एक JLabel केवल-पढ़ने योग्य टेक्स्ट की एकल लाइन, एक छवि या टेक्स्ट और छवि दोनों प्रदर्शित कर सकता है। एक JLabel HTML टैग के अंदर <font size=font-size color=c

  1. Java में JToggleButton कैसे लागू करें Java में JToggleButton कैसे लागू करें

    JToggleButtonएक JToggleButton AbstractButton का एक्सटेंशन है और इसका उपयोग उन बटनों को दर्शाने के लिए किया जा सकता है जिन्हें ON और OFF किया जा सकता है।जब JToggleButton को पहली बार दबाया जाता है, तो यह दबा हुआ रहता है और इसे केवल दूसरी बार दबाने पर रिलीज़ किया जा सकता है।एक JToggleButton हर बार दबाए