जावा 9 ने मॉड्यूल के संग्रह में एपीआई को शामिल किया। इसलिए, प्रतिरूपकता केंद्रीय विषय है; इसने शीर्ष स्तर से कार्यक्रम के डिजाइन को प्रभावित किया। कार्यक्रमों को शुरू से ही मॉड्यूलर बनाया जा सकता है। इसमें कोई आश्चर्य की बात नहीं है कि विशेष रूप से एक मॉड्यूल . नामक प्रोग्रामिंग तत्व से निपटने के लिए एपीआई होंगे . एपीआई प्रोग्रामेटिक रूप से मॉड्यूल तक पहुंचने का एक तरीका प्रदान करते हैं। ये एपीआई मॉड्यूल के बारे में विशिष्ट जानकारी प्राप्त करने या उन्हें पढ़ने या हेरफेर करने के लिए काफी काम आते हैं। यह आलेख आपको मॉड्यूल एपीआई कक्षाओं और कुछ विधियों की खोज करता है, उदाहरण के साथ आपको उनकी समग्र कार्यक्षमता का एक विचार देने के लिए।
एक सिंहावलोकन
जावा 9 प्रोग्राम के रूप में मॉड्यूल से निपटने के लिए कक्षाओं और इंटरफेस का एक सेट प्रदान करता है। ये API निम्न के लिए विशेष रूप से उपयोगी हैं:
- मॉड्यूल पढ़ना, लोड करना और खोजना
- मॉड्यूल डिस्क्रिप्टर को पढ़ना और उनमें हेरफेर करना
एपीआई की सूची मुख्य रूप से पैकेज में शामिल है:java.lang और java.lang.module . हालांकि java.lang.module पैकेज में मॉड्यूल डिस्क्रिप्टर से निपटने के लिए अधिकांश वर्ग और इंटरफेस शामिल हैं, java.lang पैकेज में कक्षाएं शामिल हैं मॉड्यूल , मॉड्यूललेयर , और एक अपवाद, LayerInstantiationException . इन तीनों में, मॉड्यूल वर्ग प्राथमिक महत्व का है क्योंकि इस वर्ग का एक उदाहरण पढ़ने, लोड करने और मॉड्यूल खोजने से जुड़े सभी तरीकों को प्रदान करता है। java.lang.module . में सबसे महत्वपूर्ण वर्ग पैकेज ModuleDescriptor है . यह वर्ग मॉड्यूल डिस्क्रिप्टर से निपटने के लिए आवश्यक तरीके प्रदान करता है।
मॉड्यूल API
जावा एपीआई दस्तावेज़ीकरण के अनुसार, मॉड्यूल वर्ग नामित और अनाम रन-टाइम मॉड्यूल दोनों का प्रतिनिधित्व करता है। नामित मॉड्यूल का एक नाम होता है और जावा वर्चुअल मशीन द्वारा निर्मित होते हैं जब मॉड्यूल परत बनाने के लिए जावा वर्चुअल मशीन को मॉड्यूल का ग्राफ परिभाषित किया जाता है। एक अनाम मॉड्यूल का कोई नाम नहीं है। प्रत्येक ClassLoader . के लिए एक अनाम मॉड्यूल है , इसके getUnnamedModule . को लागू करके प्राप्त किया गया तरीका। सभी प्रकार जो नामित मॉड्यूल में नहीं हैं, उनके परिभाषित वर्ग लोडर के अनाम मॉड्यूल के सदस्य हैं।
उस वर्ग के मॉड्यूल का पता लगाना आसान है जिससे वह संबंधित है। उदाहरण के लिए, यदि हम किसी वर्ग के मॉड्यूल का पता लगाना चाहते हैं, तो कहें, ArrayList , संग्रह API से या कहें, आवेदन JavaFX से, हम ऐसा निम्न तरीके से कर सकते हैं।
Class<ArrayList> c= ArrayList.class; Module mod=c.getModule(); System.out.println(mod.getName());
या, एक ही कथन में, इस प्रकार है:
System.out.println(Application.class .getModule().getName());
यह कक्षा के मॉड्यूल नाम को प्रिंट करता है, जैसे java.base , सरणीसूची . के लिए , और javafx.graphics आवेदन . के लिए . क्योंकि एक मॉड्यूल को या तो अनाम नाम दिया जा सकता है, हम isNamed() को लागू करके पता लगा सकते हैं तरीका। यह विधि सत्य returns लौटाती है यदि मॉड्यूल का नाम है या गलत . है यदि यह एक अनाम मॉड्यूल है। यहां अनाम मॉड्यूल का एक उदाहरण दिया गया है।
package org.mano.java9.examples; public class Main { public static void main(String[] args) { Class<Main> c= Main.class; Module mod=c.getModule(); System.out.println(mod); System.out.println(mod.getName()); System.out.println(mod.getName()+" is " +(mod.isNamed()? "Named Module":"Unnamed Module")); System.out.println(mod.getDescriptor()); } }
आउटपुट:
unnamed module @4c75cab9 null null is Unnamed Module null
और, नामित मॉड्यूल के लिए, हम इस प्रकार लिख सकते हैं:
package org.mano.java9.examples; import java.util.ArrayList; public class Main { public static void main(String[] args) { Class<ArrayList> c= ArrayList.class; Module mod=c.getModule();< System.out.println(mod); System.out.println(mod.getName()); System.out.println(mod.getName()+" is " +(mod.isNamed()? "Named Module":"Unnamed Module")); System.out.println(mod.getDescriptor()); } }
आउटपुट:
module java.base java.base java.base is Named Module module { name: [email protected], uses: [java.nio.file.spi.FileTypeDetector, ...}
एक मॉड्यूल लेयर केवल नामित मॉड्यूल शामिल हैं। हम getLayer . का आह्वान कर सकते हैं मॉड्यूल में शामिल परत के बारे में जानकारी प्राप्त करने की विधि। यदि यह शून्य लौटाता है, तो इसका मतलब है कि मॉड्यूल एक परत में नहीं है, या यह एक अनाम मॉड्यूल है। यदि हम मॉड्यूल में उपलब्ध पैकेजों की सूची प्राप्त करना चाहते हैं, तो हम getPackages का उपयोग कर सकते हैं तरीका। getClassLoader विधि मॉड्यूल क्लास लोडर लौटाती है। ऊपर वर्णित विधियों को स्पष्ट करने के लिए यहां एक उदाहरण दिया गया है।
package org.app.module1; import javafx.application.Application; import java.util.Set; public class Main { public static void main(String[] args) { Class<Application> c = Application.class; Module mod = c.getModule(); System.out.println("Name :" + mod.getName()); System.out.println(mod.getName() + " is " + (mod.isNamed() ? "Named Module" : "Unnamed Module")); System.out.println("Layer :" + mod.getLayer()); System.out.println("ClassLoader :" + mod.getClassLoader()); System.out.println("List of Packagesn....................."); Set<String> set = mod.getPackages(); int i=1; for (String s : set) { System.out.println(i+++") "+s); } } }
आउटपुट:
Name :javafx.graphics javafx.graphics is Named Module Layer :jdk.compiler, java.compiler, jdk.management.jfr, jdk.scripting.nashorn, ... ClassLoader :jdk.internal.loader.ClassLoaders [email protected] .................... List of Packages ..................... 1) com.sun.javafx.stage 2) com.sun.scenario.effect.impl.prism.ps 3) javafx.print ... 107) com.sun.prism.j2d 108) javafx.scene.image
मॉड्यूल विवरण
जावा 9 एपीआई डॉक्यूमेंटेशन के अनुसार, "एक मॉड्यूल डिस्क्रिप्टर एक नामित मॉड्यूल का वर्णन करता है और इसके प्रत्येक घटक को प्राप्त करने के तरीकों को परिभाषित करता है।" जावा वर्चुअल मशीन में नामित मॉड्यूल के लिए मॉड्यूल डिस्क्रिप्टर मॉड्यूल को लागू करके प्राप्त किया जाता है गेट डिस्क्रिप्टर तरीका। मॉड्यूल डिस्क्रिप्टर ModuleDescriptor.Builder . का उपयोग करके भी बनाया जा सकता है क्लास या मॉड्यूल डिक्लेरेशन के बाइनरी फॉर्म को पढ़कर (module-info.class ) पढ़ें . का उपयोग करके इस वर्ग में परिभाषित तरीके।
इसलिए, आमतौर पर मॉड्यूल डिस्क्रिप्टर इंस्टेंस मॉड्यूल डिस्क्रिप्टर फ़ाइल के बाइनरी रूप में पाई जाने वाली मॉड्यूल परिभाषा का प्रतिनिधित्व करता है, जिसे मॉड्यूल-info.class कहा जाता है। . मॉड्यूल परिभाषा को पढ़ने और हेरफेर करने के अलावा, हम ModuleDescriptor.Builder का उपयोग कर सकते हैं क्लास रन टाइम पर मॉड्यूल का वर्णन करने के लिए।
एक मॉड्यूल डिस्क्रिप्टर तीन प्रकार के मॉड्यूल का वर्णन करता है, जैसे सामान्य, खुला और स्वचालित मॉड्यूल।
एक सामान्य और एक खुला मॉड्यूल स्पष्ट रूप से उन सेवाओं का वर्णन करता है जो वे प्रदान करते हैं या उपयोग करते हैं, निर्भरता, निर्यात किए गए पैकेज और अन्य घटक। एक सामान्य मॉड्यूल और एक खुले मॉड्यूल के बीच मुख्य अंतर यह है कि सामान्य मॉड्यूल विशिष्ट पैकेज खोल सकते हैं। एक खुले मॉड्यूल के लिए मॉड्यूल डिस्क्रिप्टर किसी भी खुले पैकेज की घोषणा नहीं करता है (इसका खुलाता है मेथड एक खाली सेट लौटाता है), लेकिन जब जावा वर्चुअल मशीन में इंस्टेंट किया जाता है, तो ऐसा माना जाता है कि सभी पैकेज खुले हैं।
स्वचालित मॉड्यूल, हालांकि, java.base की निहित घोषणा को छोड़कर किसी निर्यात, खुले पैकेज या निर्भरता की घोषणा नहीं करता है। मापांक। जब जावा वर्चुअल मशीन में एक स्वचालित मॉड्यूल को इंस्टेंट किया जाता है, तो यह प्रत्येक अनाम मॉड्यूल को पढ़ता है और ऐसा माना जाता है कि सभी पैकेज निर्यात और खुले हैं।
getDescriptor मॉड्यूल . की विधि वर्ग ModuleDescriptor . का एक उदाहरण देता है कक्षा। मॉड्यूल डिस्क्रिप्टर कक्षा में स्थिर नेस्टेड वर्ग होते हैं जिनका उदाहरण मॉड्यूल घोषणा फ़ाइल में निर्देश कथन का प्रतिनिधित्व करता है। हालांकि, इस वर्ग में उपयोग . शामिल नहीं है स्टेटमेंट जिसे आमतौर पर एक सर्विस इंस्टेंस स्ट्रिंग . द्वारा दर्शाया जा सकता है . ये हैं वे अन्य चार:
- ModuleDescriptor.आवश्यकता है
- ModuleDescriptor.opens
- ModuleDescriptor.प्रदान करता है
- ModuleDescriptor.Exports
एक त्वरित उदाहरण
package org.mano.java9.examples; import javax.sql.RowSet; import java.lang.module.ModuleDescriptor; import java.util.List; public class Main { public static void main(String[] args) { System.out.println("Module Name: " + List.class.getModule().getName()); show(List.class.getModule().getDescriptor()); System.out.println("Module Name: " + RowSet.class.getModule().getName()); show(RowSet.class.getModule().getDescriptor()); } public static void show(ModuleDescriptor d) { System.out.println("Module Descriptionn-------------------------"); System.out.println("Requires: " + d.requires()); System.out.println("Exports: " + d.exports()); System.out.println("Uses: " + d.uses()); System.out.println("Provides: " + d.provides()); System.out.println("Packages: " + d.packages()); } }
आउटपुट:
Module Name: java.base Module Description ------------------------- Requires: [] Exports: [jdk.internal.org.objectweb.asm.signature to [jdk.scripting.nashorn], ...] Uses: [java.util.spi.LocaleNameProvider, java.nio.file.spi.FileSystemProvider, ...] Provides: [java.nio.file.spi.FileSystemProvider with [jdk.internal.jrtfs.JrtFileSystemProvider]] Packages: [java.nio.file, jdk.internal.org.objectweb.asm .tree.analysis, com.sun.security.ntlm, ...] Module Name: java.sql Module Description ------------------------- Requires: [mandated java.base, transitive java.logging, transitive java.xml] Exports: [java.sql, javax.transaction.xa, javax.sql] Uses: [java.sql.Driver] Provides: [] Packages: [javax.sql, javax.transaction.xa, java.sql]
मॉड्यूल डिस्क्रिप्टर बाइनरी फ़ाइल, जिसे module-info.class कहा जाता है , ModuleDescriptor का एक उदाहरण बनाने के लिए सीधे निम्नलिखित तरीके से पढ़ा जा सकता है कक्षा:
try { ModuleDescriptor descriptor = ModuleDescriptor .read(new FileInputStream("module-info.class")); } catch (IOException ex) { }
ओवरलोडेड स्थिर पठन . के चार संस्करण हैं ModuleDescriptor . में परिभाषित विधि कक्षा। उनका उपयोग इनपुट स्ट्रीम या बाइट बफर से मॉड्यूल विवरण के बाइनरी फॉर्म को पढ़ने के लिए किया जाता है। यहाँ Java 9 API दस्तावेज़ीकरण से निष्कर्षण है।
- पढ़ें(इनपुटस्ट्रीम में) :मॉड्यूल डिस्क्रिप्टर के रूप में इनपुट स्ट्रीम से मॉड्यूल डिक्लेरेशन के बाइनरी फॉर्म को पढ़ता है।
- पढ़ें(इनपुटस्ट्रीम इन, सप्लायर <सेट<स्ट्रिंग>>पैकेजफाइंडर) :मॉड्यूल डिस्क्रिप्टर के रूप में इनपुट स्ट्रीम से मॉड्यूल डिक्लेरेशन के बाइनरी फॉर्म को पढ़ता है।
- पढ़ें(बाइटबफर बीबी) :मॉड्यूल डिस्क्रिप्टर के रूप में बाइट बफर से मॉड्यूल डिक्लेरेशन के बाइनरी फॉर्म को पढ़ता है।
- पढ़ें(बाइटबफर बीबी, प्रदायक <सेट<स्ट्रिंग>>पैकेजफाइंडर) :मॉड्यूल डिस्क्रिप्टर के रूप में बाइट बफर से मॉड्यूल डिक्लेरेशन के बाइनरी फॉर्म को पढ़ता है।
packageFinder . द्वारा संकुल सेट करें उन सभी पैकेजों को शामिल करें जो मॉड्यूल निर्यात करता है, खोलता है, प्रदान की गई सेवाएं, और मुख्य वर्ग का पैकेज जो इनपुट स्ट्रीम या बाइट बफर में दिए गए डिस्क्रिप्टर द्वारा एन्कोड नहीं किया गया है।
निष्कर्ष
मॉड्यूल के बारे में बुनियादी जानकारी पढ़ने के अलावा, मॉड्यूल क्लास मॉड्यूल की स्थिति के बारे में पूछताछ करने के लिए कुछ प्रमुख तरीके प्रदान करता है-चाहे वह पढ़ा जाए, खुला हो, निर्यात किया गया हो, आदि। एपीआई addOpens . जैसी विधियां भी प्रदान करता है , एक्सपोर्ट जोड़ें , उपयोग जोड़ें , और पढ़ें जोड़ें प्रोग्राम के रूप में मॉड्यूल डिस्क्रिप्टर में खुले और निर्यात उपयोगों को जोड़ने और बयानों को पढ़ने के लिए। संक्षेप में, मॉड्यूल एपीआई विशेष रूप से प्रोग्रामेटिक रूप से मॉड्यूल से निपटने के लिए कई अन्य तरीके प्रदान करता है। यहां, हमने इस सब के बारे में एक प्रारंभिक विचार देने के लिए अभी सतह को खरोंच दिया है।