विभिन्न अवधारण नीतियां मेरे एनोटेशन को कैसे प्रभावित करती हैं?


175

क्या कोई स्पष्ट रूप से java.lang.annotation.RetentionPolicyस्थिरांक और SOURCE, के बीच व्यावहारिक अंतर की व्याख्या कर सकता है ?CLASSRUNTIME

मुझे यह भी पक्का नहीं पता है कि वाक्यांश "रिटेनिंग एनोटेशन" का क्या मतलब है।


5
प्रलेखन ( java.sun.com/j2se/1.5.0/docs/api/java/lang/annotation/… ) बहुत स्पष्ट है।
ट्रू सॉफ्ट

हां, मैं पहले से ही पढ़ता हूं, लेकिन मैं अभ्यास में नहीं समझता कि यह कैसे काम करता है। वास्तव में अगर मैं 'यह वाक्यांश' आजमाता हूं: "" "संकलक द्वारा फाइल को वर्ग फ़ाइल में दर्ज किया जाना है, लेकिन रन समय में वीएम द्वारा बनाए रखने की आवश्यकता नहीं है। "" "और फिर एक विघटित वर्ग खोलें जहां मैंने प्रतिधारण नीति के साथ एक एनोटेशन रखा है कक्षा मुझे कुछ नहीं मिला ...
xdevel2000

2
तब आपका डिकंपाइलर एनोटेशन का समर्थन नहीं करता है। jd-gui ठीक काम करता है।
मुसकिन

धन्यवाद समस्या मेरी decompiler डीजे और जद था ... jd-gui मुझे दिखाओ !!
xdevel2000

जवाबों:


210
  • RetentionPolicy.SOURCE: संकलन के दौरान त्याग करें। संकलन पूरा होने के बाद इन टिप्पणियों का कोई मतलब नहीं है, इसलिए वे बायटेकोड को नहीं लिखे गए हैं।
    उदाहरण: @Override,@SuppressWarnings

  • RetentionPolicy.CLASS: क्लास लोड के दौरान त्यागें। बाइटकोड-स्तरीय पोस्ट-प्रोसेसिंग करते समय उपयोगी। कुछ आश्चर्य की बात है, यह डिफ़ॉल्ट है।

  • RetentionPolicy.RUNTIME: त्यागने नहीं है। एनोटेशन रनटाइम पर प्रतिबिंब के लिए उपलब्ध होना चाहिए। उदाहरण:@Deprecated

स्रोत: पुराना URL अब मर चुका है hunter_meta और इसे hunter-meta-2-098036 के साथ बदल दिया गया है । यदि यह नीचे चला जाता है, तो भी मैं पृष्ठ की छवि अपलोड कर रहा हूं।

छवि (राइट क्लिक करें और नई टैब / विंडो में खुली छवि का चयन करें) ओरेकल वेबसाइट का स्क्रीनशॉट


1
उद्धरण के लिए धन्यवाद, सबसे दिलचस्प यहां का उपयोग मामला हैRetentionPolicy.CLASS
अधिकतम

2
क्या आप बता सकते हैं कि RetentionPolicy.class दिलचस्प / आश्चर्यजनक रूप से डिफ़ॉल्ट क्यों है?
सुडोकुडर

1
@sudocoder - इन लिंक्स का संदर्भ लें: stackoverflow.com/a/5971247/373861 और stackoverflow.com/a/3849602/373861 । मैं देख रहा हूँ कि इस विशेष नीति की आवश्यकता बायटेकोड इंस्ट्रूमेंटेशन के लिए है। हालांकि मैंने खुद इसका कभी इस्तेमाल नहीं किया।
फेवोनियस

अंत में यह कहता है कि इस श्रृंखला के अगले लेख में, मैं दिखाऊंगा कि रन टाइम पर एनोटेशन की खोज करने में आपकी मदद करने के लिए जावा की प्रतिबिंब क्षमताओं को कैसे बढ़ाया गया है और एनोटेशन प्रोसेसिंग टूल "एप" आपको बिल्ड-टाइम पर एनोटेशन का उपयोग करने देता है। , यह लेख कहाँ है
सुशांत

@ सुशांत: अच्छा मुझे यकीन नहीं है कि यह कहाँ है :)। हालांकि aptइस docs.oracle.com/javase/7/docs/technotes/guides/aptors/… पर संदर्भित संदर्भ है । प्रतिबिंब का उपयोग करके एनोटेशन की खोज के लिए इंटरनेट पर कई ट्यूटोरियल हैं। आप में देख द्वारा शुरू कर सकते हैं java.lang.Class::getAnno*और में इसी तरह के तरीकों java.lang.reflect.Methodऔर java.lang.reflect.Field
फावोनियस

57

कक्षा के विघटन के बारे में आपकी टिप्पणियों के अनुसार, यहां बताया गया है कि मुझे लगता है कि इसे काम करना चाहिए:

  • RetentionPolicy.SOURCE: विघटित वर्ग में नहीं दिखाई देगा

  • RetentionPolicy.CLASS: विघटित वर्ग में दिखाई देते हैं, लेकिन प्रतिबिंब के साथ रन-टाइम पर निरीक्षण नहीं किया जा सकता है getAnnotations()

  • RetentionPolicy.RUNTIME: विघटित वर्ग में प्रकट होता है, और परावर्तन के साथ रन-टाइम पर निरीक्षण किया जा सकता है getAnnotations()


हाँ मुझे भी ऐसा लगता है लेकिन विघटित वर्ग में कुछ भी मौजूद नहीं है !!! और इसलिए मैं उलझन में हूँ ... मैं javap टूल के साथ क्लास फ़ाइल का निरीक्षण करने की कोशिश करूँगा
xdevel2000

javap कुछ भी नहीं है जहाँ फिर डाल दिया जाता है?
xdevel2000

1
RetentionPolicy.CLASS का कोई उपयोग मामला?
राहुल

20

न्यूनतम रननीय उदाहरण

भाषा स्तर :

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 पर उदाहरण


तो किसी भी विचार Runtime.SOURCE और Runtime.CLASS का उपयोग क्या है?
प्रवीण कामथ

@PraveenKamath मुझे कोई उदाहरण नहीं पता कि वे कहाँ उपयोगी हैं। संभवतः केवल तब होता है जब आप निचले स्तर के जेवीएम सामान कर रहे होते हैं जो अधिकांश देव कभी नहीं करते हैं। मुझे पता है अगर आप उनके लिए एक आवेदन मिल जाए।
सिरो सेंटिल्ली 郝海东 冠状 iro i 法轮功 '

5

अवधारण नीति: एक प्रतिधारण नीति निर्धारित करती है कि एनोटेशन को किस बिंदु पर छोड़ दिया जाता है। यह जावा के अंतर्निहित एनोटेशन का उपयोग करके निर्दिष्ट किया गया है: @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.

0
  • क्लास ASS एनोटेशन को कंपाइलर द्वारा क्लास फाइल में रिकॉर्ड किया जाना है लेकिन रन टाइम में वीएम द्वारा इसे बरकरार रखने की जरूरत नहीं है।
  • RUNTIME ations एनोटेशन को कंपाइलर द्वारा क्लास फाइल में रिकॉर्ड किया जाना है और VM द्वारा रन टाइम पर रिटेन किया जाता है, इसलिए इन्हें रिफ्लेक्टिवली पढ़ा जा सकता है।
  • स्रोत ations एनोटेशन को संकलक द्वारा खारिज किया जाना है।

ओरेकल डॉक

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.