क्या कोई स्पष्ट रूप से java.lang.annotation.RetentionPolicy
स्थिरांक और SOURCE
, के बीच व्यावहारिक अंतर की व्याख्या कर सकता है ?CLASS
RUNTIME
मुझे यह भी पक्का नहीं पता है कि वाक्यांश "रिटेनिंग एनोटेशन" का क्या मतलब है।
क्या कोई स्पष्ट रूप से java.lang.annotation.RetentionPolicy
स्थिरांक और SOURCE
, के बीच व्यावहारिक अंतर की व्याख्या कर सकता है ?CLASS
RUNTIME
मुझे यह भी पक्का नहीं पता है कि वाक्यांश "रिटेनिंग एनोटेशन" का क्या मतलब है।
जवाबों:
RetentionPolicy.SOURCE
: संकलन के दौरान त्याग करें। संकलन पूरा होने के बाद इन टिप्पणियों का कोई मतलब नहीं है, इसलिए वे बायटेकोड को नहीं लिखे गए हैं।
उदाहरण:@Override
,@SuppressWarnings
RetentionPolicy.CLASS
: क्लास लोड के दौरान त्यागें। बाइटकोड-स्तरीय पोस्ट-प्रोसेसिंग करते समय उपयोगी। कुछ आश्चर्य की बात है, यह डिफ़ॉल्ट है।
RetentionPolicy.RUNTIME
: त्यागने नहीं है। एनोटेशन रनटाइम पर प्रतिबिंब के लिए उपलब्ध होना चाहिए। उदाहरण:@Deprecated
स्रोत:
पुराना URL अब मर चुका है
hunter_meta और इसे hunter-meta-2-098036 के साथ बदल दिया गया है । यदि यह नीचे चला जाता है, तो भी मैं पृष्ठ की छवि अपलोड कर रहा हूं।
छवि (राइट क्लिक करें और नई टैब / विंडो में खुली छवि का चयन करें)
RetentionPolicy.CLASS
apt
इस docs.oracle.com/javase/7/docs/technotes/guides/aptors/… पर संदर्भित संदर्भ है । प्रतिबिंब का उपयोग करके एनोटेशन की खोज के लिए इंटरनेट पर कई ट्यूटोरियल हैं। आप में देख द्वारा शुरू कर सकते हैं java.lang.Class::getAnno*
और में इसी तरह के तरीकों java.lang.reflect.Method
और java.lang.reflect.Field
।
कक्षा के विघटन के बारे में आपकी टिप्पणियों के अनुसार, यहां बताया गया है कि मुझे लगता है कि इसे काम करना चाहिए:
RetentionPolicy.SOURCE
: विघटित वर्ग में नहीं दिखाई देगा
RetentionPolicy.CLASS
: विघटित वर्ग में दिखाई देते हैं, लेकिन प्रतिबिंब के साथ रन-टाइम पर निरीक्षण नहीं किया जा सकता है getAnnotations()
RetentionPolicy.RUNTIME
: विघटित वर्ग में प्रकट होता है, और परावर्तन के साथ रन-टाइम पर निरीक्षण किया जा सकता है getAnnotations()
न्यूनतम रननीय उदाहरण
भाषा स्तर :
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
@Retention(RetentionPolicy.SOURCE)
@interface RetentionSource {}
@Retention(RetentionPolicy.CLASS)
@interface RetentionClass {}
@Retention(RetentionPolicy.RUNTIME)
@interface RetentionRuntime {}
public static void main(String[] args) {
@RetentionSource
class B {}
assert B.class.getAnnotations().length == 0;
@RetentionClass
class C {}
assert C.class.getAnnotations().length == 0;
@RetentionRuntime
class D {}
assert D.class.getAnnotations().length == 1;
}
बाइटकोड स्तर : javap
हम का उपयोग करते हुए कि Retention.CLASS
एनोटेट वर्ग एक रनटाइम इनविजिबल वर्ग विशेषता प्राप्त करता है:
#14 = Utf8 LRetentionClass;
[...]
RuntimeInvisibleAnnotations:
0: #14()
जबकि Retention.RUNTIME
एनोटेशन को एक RuntimeVoice वर्ग विशेषता मिलती है :
#14 = Utf8 LRetentionRuntime;
[...]
RuntimeVisibleAnnotations:
0: #14()
और Runtime.SOURCE
एनोटेट .class
को कोई एनोटेशन नहीं मिलता है।
आप के साथ खेलने के लिए GitHub पर उदाहरण ।
अवधारण नीति: एक प्रतिधारण नीति निर्धारित करती है कि एनोटेशन को किस बिंदु पर छोड़ दिया जाता है। यह जावा के अंतर्निहित एनोटेशन का उपयोग करके निर्दिष्ट किया गया है: @Retention
[के बारे में]
1.SOURCE: annotation retained only in the source file and is discarded
during compilation.
2.CLASS: annotation stored in the .class file during compilation,
not available in the run time.
3.RUNTIME: annotation stored in the .class file and available in the run time.