मॉड्यूल और उनके संबंधित पैकेजों के बीच पहुंच की समझ के अलावा। मेरा मानना है कि इसका क्रेज मॉड्यूल सिस्टम # रिलैक्स्ड-स्ट्रॉन्ग-इनकैप्सुलेशन में निहित है और मैं सवाल पूछने और जवाब देने के लिए इसके संबंधित हिस्सों को चेरी-पिक करूंगा।
एक अवैध चिंतनशील पहुंच को परिभाषित करता है और किन परिस्थितियों में चेतावनी ट्रिगर होती है?
जावा -9 के प्रवास में सहायता के लिए, मॉड्यूल के मजबूत इनकैप्सुलेशन को शिथिल किया जा सकता है।
एक कार्यान्वयन स्थिर पहुंच प्रदान कर सकता है , अर्थात संकलित बायटेकोड द्वारा।
मई अपने रन-टाइम सिस्टम को एक या अधिक मॉड्यूल के एक या अधिक पैकेजों के साथ लागू करने का साधन प्रदान करता है जो सभी अनाम मॉड्यूल में कोड करने के लिए खुले होते हैं , अर्थात क्लासपैथ पर कोड करने के लिए। यदि रन-टाइम सिस्टम को इस तरह से लागू किया जाता है, और यदि ऐसा करने से प्रतिबिंब एपीआई के कुछ चालान सफल होते हैं, तो अन्यथा वे विफल हो जाते।
ऐसे मामलों में, आपने वास्तव में एक चिंतनशील पहुंच बना ली है जो "अवैध" है क्योंकि शुद्ध मॉड्यूलर दुनिया में आप इस तरह की एक्सेस करने के लिए नहीं थे।
यह सब कैसे एक साथ लटका रहता है और किस परिदृश्य में चेतावनी को ट्रिगर करता है?
--illegal-access
एनकैप्सुलेशन की इस छूट को रनटाइम पर एक नए लॉन्चर विकल्प द्वारा नियंत्रित किया जाता है जो कि जावा 9 में डिफ़ॉल्ट रूप से होता है permit
। permit
मोड सुनिश्चित
ऐसे किसी भी पैकेज के लिए पहला रिफ्लेक्टिव-एक्सेस ऑपरेशन एक चेतावनी जारी करने का कारण बनता है, लेकिन उस बिंदु के बाद कोई चेतावनी जारी नहीं की जाती है। यह एकल चेतावनी बताती है कि आगे की चेतावनी को कैसे सक्षम किया जाए। इस चेतावनी को दबाया नहीं जा सकता।
मोड मूल्यों के साथ कॉन्फ़िगर करने योग्य हैं debug
(संदेश और साथ ही ऐसी हर एक्सेस के लिए स्टैकट्रेस), warn
(प्रत्येक ऐसी एक्सेस के लिए संदेश), और deny
(इस तरह के संचालन को अक्षम करता है)।
अनुप्रयोगों पर डिबग और फिक्स करने के लिए कुछ चीजें होंगी: -
- इसके
--illegal-access=deny
बारे में जानने के लिए इसे चलाएं और वीएम एर्ग के ऐसे निर्देश ( ) या स्पष्ट उपयोग सहित मॉड्यूल घोषणा के बिना एक मॉड्यूल से दूसरे में खुले आईएनजी पैकेज से बचें ।opens
--add-opens
- संकलित कोड से JDK- आंतरिक APIs के स्थिर संदर्भों
jdeps
को --jdk-internals
विकल्प के साथ उपकरण का उपयोग करके पहचाना जा सकता है
अवैध चिंतनशील-पहुंच संचालन का पता चलने पर जारी किया गया चेतावनी संदेश निम्न रूप में है:
WARNING: Illegal reflective access by $PERPETRATOR to $VICTIM
कहाँ पे:
$PERPETRATOR
उस प्रकार का पूरी तरह से योग्य नाम है जिसमें कोड शामिल है जो प्रश्न में चिंतनशील संचालन को लागू करता है और यदि उपलब्ध हो तो कोड स्रोत (यानी, JAR- फ़ाइल पथ), और
$VICTIM
एक स्ट्रिंग है जो सदस्य को एक्सेस करने का वर्णन करता है, जिसमें पूरी तरह से योग्य नाम संलग्नक प्रकार शामिल है
इस तरह के एक नमूना चेतावनी के लिए प्रश्न: = JDK9: एक अवैध चिंतनशील पहुंच संचालन हुआ है। org.python.core.PySystemState
अंतिम और एक महत्वपूर्ण नोट, यह सुनिश्चित करने की कोशिश करते हुए कि आप इस तरह की चेतावनियों का सामना नहीं करते हैं और भविष्य में सुरक्षित हैं, आपको बस यह सुनिश्चित करने की आवश्यकता है कि आपके मॉड्यूल उन अवैध चिंतनशील पहुंचों को नहीं बना रहे हैं। :)