2011-10-09 15 views
9

मैं अभी भी काफी जावा प्रोग्रामिंग करने के लिए नया हूँ और मैं एक ओपन सोर्स प्रोजेक्ट से अधिक देख रहा था और मैंने पहले @ के उपयोग को देखा है, लेकिन केवल एक सदस्य से पहले @override जैसी चीज़ों के लिए इसउपयोगकर्ता एनोटेशन कैसे काम करते हैं?

public @TileNetworkData int progressPart = 0; 

बारे में जाना। मेरी आश्चर्य के लिए यह मुझे उपयोगकर्ता कोड

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

@Retention(RetentionPolicy.RUNTIME) 
@Inherited 
public @interface TileNetworkData { 

    int staticSize() default -1; 

} 

यह कोड क्या कर रहा है, और इसके लिए क्या उपयोगी है? ऐसा लगता है कि यह क्षेत्र में मेटाडेटा के कुछ रूप जोड़ रहा है। इस तरह कुछ कैसे इस्तेमाल किया जाता है?

कुछ Googleिंग करने से मुझे पता चला कि इसे "एनोटेशन" कहा जाता है लेकिन इससे जुड़ी सब कुछ मेरे सिर पर चली गई। किसी भी तरह का उदाहरण जहां इस तरह कुछ इस्तेमाल किया जाएगा की सराहना की जाएगी।

उत्तर

5

Annotations "मशीन-पठनीय मेटाडाटा" के रूप में उपयोग किया जाता है - वे उन क्षेत्रों, विधियों और वर्गों का वर्णन करते हैं, जिन्हें वे लेबल करते हैं, संकलक और रनटाइम पार्स कर सकते हैं, और संभवतः यहां तक ​​कि समझ भी सकते हैं। यदि आप .NET's attributes से परिचित हैं, तो आप पाएंगे कि जावा एनोटेशन का उपयोग समान रूप से किया जाता है।

उदाहरण के लिए, TileNetworkData आपके उदाहरण में परिभाषित एनोटेशन स्वयं को एनोटेशन Retention(RetentionPolicy.RUNTIME) से सजाया गया है। यह संकलक को टाइलनेटवर्कडेटा एनोटेशन को बाइटकोड में एम्बेड करने वाले फ़ील्ड के लिए एम्बेड करने के लिए कहता है। एक ही एनोटेशन जावा रनटाइम को भी बताता है कि, जब यह टाइलनेटवर्कडेटा-एनोटेटेड फ़ील्ड्स के साथ कक्षाएं लोड करता है, तो इसे रनटाइम प्रतिबिंब के लिए टाइलनेटवर्कडेटा एनोटेशन को बनाए रखना चाहिए।

// I haven't even compiled this code, and even if it works, it's still insane. 
// (others who know annotations better should feel free to edit or replace) 
public void copyTileNetworkDataToCache (Object data, Cache<?> cache) { 
    for (Field f : data.getClass().getFields()) { 
    if (f.isAnnotationPresent(TileNetworkData.class)) { 
     cache.save(f.get(data)); 
    } 
    } 
} 

तुम भी कोड है कि जावा संकलक how to interpret your annotations at compile time सिखाता है, apt का उपयोग कर लिख सकते हैं:

अब, अपने कोड TileNetworkData एनोटेशन खोजने के लिए और क्षेत्रों तो एनोटेट साथ कुछ करने के लिए एक वस्तु के क्षेत्रों पर प्रदर्शित कर सकते हैं जेडीके 5 और बाद में जेडीके 5 और javac स्विच में फ्रंट एंड। एक और लंगड़ा उदाहरण बनाने के लिए, टाइल नेटवर्क तक पहुंचने में इतना समय लग सकता है कि जब भी संभव हो, आप डेटा का उपयोग करने से बचना चाहते हैं। इसलिए, हो सकता है कि आप उन सभी वर्गों की एक सूची बनाना चाहें जिनमें टाइलनेटवर्कडेटा-एनोटेटेड फ़ील्ड्स शामिल हैं, ताकि आप उन सभी की समीक्षा कर सकें और संभावित रूप से उन लोगों को फिर से लिख सकें जिन्हें पूरी तरह से टाइल नेटवर्क तक पहुंचने की आवश्यकता नहीं है। ऐसा करने के लिए, आप एक एनोटेशन प्रोसेसर लिख सकते हैं जो सभी मिलान करने वाले वर्गों को प्रिंट करता है, फिर संकलित करते समय प्रोसेसर पर apt इंगित करें।

2

विधियों, वर्गों और अन्य प्रकार के ऑब्जेक्ट का वर्णन करने के लिए मेटा-डेटा के लिए एनोटेशन का उपयोग किया जाता है।

आप अपने जावा कक्षाओं में मेटा-डेटा (डेटा का विवरण) असाइन करने के लिए उपयोग कर सकते हैं। क्लासिक उदाहरण @Deprecated है, जो 'भविष्य में उपयोग नहीं किया जाने वाला' तरीका है।

उदाहरण के लिए, आप उन्हें जावा क्लास में कॉन्फ़िगरेशन जानकारी जोड़ने के लिए उपयोग कर सकते हैं। यदि आप हाइबरनेट (एक ओआरएम) का उपयोग कर रहे हैं, तो आप कक्षा में एनोटेशन जोड़ते हुए कहते हैं कि इस वर्ग को डेटाबेस तालिका table_xxx में निहित जानकारी से पॉप्युलेट किया जाना चाहिए, और कॉलम column_xxx जानकारी कक्षा में ऐसे और ऐसे क्षेत्र में संग्रहीत की जानी चाहिए।

आपके द्वारा पोस्ट किया गया कोड एनोटेशन को परिभाषित कर रहा है। यह इस टिप्पणी को आपके कोड में कहीं और इस्तेमाल करने की अनुमति देगा। यह कह रहा है कि एनोटेशन रनटाइम पर उपलब्ध होगा, @Retention(RetentionPolicy.RUNTIME), और यह एनोटेशन उस वर्ग के लिए उपलब्ध होना चाहिए जो उस वर्ग के किसी भी उप-वर्ग का उपयोग करता है।

अधिक जानकारी के लिए How and where are Annotations used in Java?

+0

ओपी विशेष रूप से पूछ रहा है कि यह काफी जवाब नहीं देता है। – BoltClock

1

के जवाब मेटा डेटा प्रतिबिंब के माध्यम से पूछे जा सकती है, देखते हैं। इस प्रकार, यदि कोड में कहीं भी सामान्य void submitTileNetworkData(Object model) था तो यह model के फ़ील्ड पर फिर से चला सकता है और टाइलनेटवर्कडेटा एनोटेशन के आधार पर बाइनरी डंप का निर्माण कर सकता है।

4

उदाहरण: लेन-देन सीमांकन:

public class TransactionalThing { 
    @Transactional 
    public void doSomePersistenceStuff() { 
     Foo foo = loadAFoo(); 
     doSomeStuffWith(foo); 
     foo.setProcessed(true); 
    } 
} 

अन्य कोड है कि @Transactional द्वारा एनोटेट तरीकों के लिए लग रहा है वहाँ हो सकता है, कोई लेन-देन से पहले विधि कहा जाता है शुरू होता है, और करता है (या वापस रोल) लेन-देन जब यह खत्म । तुम भी तरह चीजों के बारे में टिप्पणी में जानकारी रख सकते हैं, उदाहरण के लिए, रोलबैक नियम:

@Transactional(rollbackFor = SomeException.class, 
       noRollbackFor = SomeOtherException.class) 

और फिर, यह सिर्फ कोड है कि इन लेनदेन उन विशेषताओं में पढ़ सकते हैं और उचित रूप से चीजों को संभालने के लिए स्कैन करता है पर निर्भर है।

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