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 का उपयोग करते हैं