2010-06-24 9 views
115

क्या कोई java.lang.annotation.RetentionPolicy स्थिरांक SOURCE, CLASS, और RUNTIME के बीच व्यावहारिक अंतर स्पष्ट रूप से समझा सकता है?विभिन्न प्रतिधारण नीतियां मेरी टिप्पणियों को कैसे प्रभावित करती हैं?

मैं भी बिल्कुल यकीन नहीं क्या वाक्यांश "एनोटेशन को बनाए रखना" का अर्थ है हूँ।

+4

प्रलेखन (http://java.sun.com/j2se/1.5.0/docs/api/java/lang/annotation/RetentionPolicy.html) बहुत स्पष्ट है। –

+0

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

+2

फिर आपका डिकंपलर एनोटेशन का समर्थन नहीं करता है। जेडी-गुई ठीक काम करता है। – musiKk

उत्तर

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

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

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

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

Image enter image description here

+1

उद्धरण के लिए धन्यवाद, सबसे दिलचस्प यहां 'RetentionPolicy.CLASS' – Max

+1

के लिए उपयोग का मामला है, क्या आप समझा सकते हैं कि RetentionPolicy.class दिलचस्प/आश्चर्यजनक रूप से क्यों है डिफ़ॉल्ट? – sudocoder

+1

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

34

(राइट क्लिक करें और 'नया टैब/विंडो में खोलें छवि' का चयन करें) वर्ग decompilation के बारे में अपनी टिप्पणी के अनुसार, यहाँ मैं कैसे लगता है कि यह काम करना चाहिए है:

  • RetentionPolicy.SOURCE: में दिखाएं: decompiled वर्ग

  • RetentionPolicy.CLASS में दिखाई नहीं देंगे वर्ग decompiled, लेकिन getAnnotations()

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

+0

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

+0

javap तब कुछ भी नहीं देता है जहां रखा जाता है? – xdevel2000

+0

लघु और प्यारा, और वास्तव में जो मैं खोज रहा था। – Matt

13

साथ प्रतिबिंब के साथ रन-टाइम में निरीक्षण किया जा सकता है मिनिमल runnable उदाहरण

भाषा स्तर:

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; 
} 

Bytecode स्तर: का उपयोग कर javap हम देख सकते हैं कि Retention.CLASS एनोटेट वर्ग एक RuntimeInvisible वर्ग विशेषता हो जाता है: Retention.RUNTIME एनोटेशन एक RuntimeVisible वर्ग विशेषता हो जाता है

#14 = Utf8    LRetentionClass; 
[...] 
RuntimeInvisibleAnnotations: 
    0: #14() 

जबकि:

#14 = Utf8    LRetentionRuntime; 
[...] 
RuntimeVisibleAnnotations: 
    0: #14() 

और Runtime.SOURCE एनोटेटेड .class कोई एनोटेशन नहीं मिलता है।

आप के साथ खेलने के लिए Examples on GitHub

7

अवधारण नीति: एक अवधारण नीति किस बिंदु एक एनोटेशन त्याग दिया जाता है पर निर्धारित करता है।

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. 

एक अवधारण नीति जावा के अंतर्निहित एनोटेशन का उपयोग निर्दिष्ट किया जाता है: @Retention।

0

RetentionPolicy.SOURCE: एनोटेशन कार्यक्रम के स्रोत कोड में उपलब्ध होगा, यह न तो .class फ़ाइल में होगा और न ही रनटाइम पर उपलब्ध होगा। कंपाइलर द्वारा प्रयुक्त।
RetentionPolicy.CLASS: एनोटेशन .class फ़ाइल में होगा लेकिन यह रनटाइम पर उपलब्ध नहीं होगा। एनोटेशन getAnnotations() के माध्यम से जावा प्रतिबिंब के माध्यम से .class फ़ाइल और रनटाइम, निरीक्षण के लिए उपलब्ध होगा: इस तरह के एएसएम के रूप में बाइट कोड हेरफेर उपकरण द्वारा संशोधनों
RetentionPolicy.RUNTIME प्रदर्शन प्रयुक्त।

संबंधित मुद्दे

 संबंधित मुद्दे