2010-10-03 13 views
20

का एक उदाहरण के लिए देख:जावा एनोटेशन - जावा एनोटेशन एपीआई के अनुसार RetentionPolicy.CLASS

  • RetentionPolicy.CLASS एनोटेशन संकलक द्वारा वर्ग फ़ाइल में दर्ज किया जाना है, लेकिन हो सकता है की जरूरत नहीं रन टाइम पर वीएम द्वारा बनाए रखा गया।

  • RetentionPolicy.RUNTIME एनोटेशन संकलक द्वारा वर्ग फ़ाइल में दर्ज की गई और रन समय में वीएम अपने पास रख लिए हैं, इसलिए वे संजीदगी से पढ़ा जा सकता है।

मैं "वर्ग" अवधारण नीति का एक नमूना के लिए देख रहा हूँ। जब हमें RUNTIME नीति के बजाय इस नीति का उपयोग करने की आवश्यकता होती है।

उत्तर

9

मेरी वर्तमान परियोजना में मेरे पास बड़ी संख्या में पुस्तकालयों में से हैं। एकमात्र उदाहरण जो मैं पा सकता हूं Google Guava लाइब्रेरी में है, उदाहरण के लिए com.google.common.annotations.GwtCompatible

मैं सच में यकीन है कि क्यों वे इस अवधारण नीति चुना है, हालांकि नहीं हूँ, - शायद उपकरण समर्थन, जहां उपकरण पढ़ वर्ग खुद को फ़ाइलें, बल्कि प्रतिबिंब एपीआई के माध्यम से जाने से के लिए। मुझे यकीन नहीं है कि मैं वास्तव में इस भेद के बिंदु को देखता हूं, हालांकि।

15

कक्षा एनोटेशन http://proguard.sourceforge.net तरह अस्पष्टकर्ता उपकरणों में किया जाता है। उदाहरण एनोटेशन @KeepName के लिए नाम mangling को निष्क्रिय है जब आप अपने वर्ग के नाम Class.forName तरह के तरीकों कॉल करने के लिए सक्षम होने के लिए अपरिवर्तित की आवश्यकता है()।

1

मिनिमल उदाहरण

import java.lang.annotation.Retention; 
import java.lang.annotation.RetentionPolicy; 

@Retention(RetentionPolicy.CLASS) 
@interface RetentionClass {} 

@Retention(RetentionPolicy.RUNTIME) 
@interface RetentionRuntime {} 

public static void main(String[] args) { 
    @RetentionClass 
    class C {} 
    assert C.class.getAnnotations().length == 0; 

    @RetentionRuntime 
    class D {} 
    assert D.class.getAnnotations().length == 1; 
} 

अगर हम एनोटेट वर्गों पर javap उपयोग करते हैं, हम चाहते हैं कि 0,123,614 देखनाएनोटेट वर्ग एक RuntimeInvisible वर्ग विशेषता हो जाता है:

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

तो जानकारी बाईटकोड में दोनों ही मामलों पर मौजूद है:

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

जबकि Retention.RUNTIME एनोटेशन एक RuntimeVisible वर्ग विशेषता हो जाता है।

इसलिए, Runtime.CLASS का उपयोग कक्षा में मनमाने ढंग से मेटाडेटा को जोड़ने के लिए किया जा सकता है, जो बाइटकोड मैनिपुलेशन उपकरण रनटाइम-दृश्य व्यवहार में हस्तक्षेप किए बिना उपयोग कर सकते हैं।

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

+0

यदि मैं एनोटेशन 'रिटेंशन पॉलिसी क्लास' (उदा। 'गुवा से' VisibleForTesting') वाली कक्षा को अपनाना चाहता हूं तो एनकोटेशन डिकंपील्ड क्लास फ़ाइल में दिखाई नहीं दे रहा है। लेकिन जावाडोक के अनुसार इस प्रकार की एनोटेशन कक्षा फ़ाइल में दर्ज की जाती है, फिर यह डिकंपील्ड जावा फ़ाइल में क्यों दिखाई नहीं दे रही है। कोई विचार? – tuk

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