2008-09-18 18 views
11

यदि किसी वर्ग ने एनोटेशन परिभाषित किया है, तो क्या यह किसी भी एनोटेशन को परिभाषित करने के लिए अपने उप-वर्ग को मजबूर करना संभव है?एनोटेशन को परिभाषित करने के लिए मैं जावा सबक्लास को कैसे मजबूर करूं?

उदाहरण के लिए, हम एक सरल वर्ग/उपवर्ग जोड़ी का हिस्सा है @Author @interface. मुझे क्या करना चाहते हैं एक ही @Author एनोटेशन परिभाषित करने के लिए प्रत्येक आगे उपवर्ग के लिए मजबूर, सड़क के नीचे कहीं एक RuntimeException को रोकने है।

TestClass.java:

import java.lang.annotation.*; 

@Retention(RetentionPolicy.RUNTIME) 
@interface Author { String name(); } 

@Author(name = "foo") 
public abstract class TestClass 
{ 
    public static String getInfo(Class<? extends TestClass> c) 
    { 
     return c.getAnnotation(Author.class).name(); 
    } 

    public static void main(String[] args) 
    { 
     System.out.println("The test class was written by " 
         + getInfo(TestClass.class)); 
     System.out.println("The test subclass was written by " 
         + getInfo(TestSubClass.class)); 
    } 
} 

TestSubClass.java:

@Author(name = "bar") 
public abstract class TestSubClass extends TestClass {} 

मैं जानता हूँ कि मैं क्रम में सभी एनोटेशन की गणना और लापता @Author के लिए जाँच कर सकते हैं, लेकिन मैं वास्तव में क्या करना चाहते हैं यदि संभव हो, तो संकलन समय पर यह।

उत्तर

4

आप संकलन समय पर जेएसआर 26 9 के साथ ऐसा कर सकते हैं। देखें: http://today.java.net/pub/a/today/2006/06/29/validate-java-ee-annotations-with-annotation-processors.html#pluggable-annotation-processing-api

+3

आप यह कैसे कर सकते हैं? मैं इसे देखना चाहता हूँ। –

+1

लिंक काम नहीं करता है। – Raj

3

मुझे पूरा यकीन है कि संकलन समय पर करना असंभव है।

हालांकि, यह "इकाई" -टेस्ट के लिए एक स्पष्ट कार्य है। यदि आपके पास इस तरह के सम्मेलन हैं जिन्हें आप लागू करना चाहते हैं, लेकिन संकलक के साथ जांचना मुश्किल या असंभव हो सकता है, "यूनिट" -टेस्ट्स उन्हें जांचने का एक आसान तरीका है।

एक और संभावना एक स्थिर विश्लेषक में एक कस्टम नियम लागू करना है। यहां कई विकल्प भी हैं।

(मैंने इकाई को डरावनी कोट्स में रखा है, क्योंकि यह वास्तव में एक विशिष्ट इकाई के बजाय सम्मेलनों का परीक्षण है। लेकिन इसे आपके यूनिट-परीक्षणों के साथ एक साथ चलाना चाहिए)।

2

आप सुपरक्लास पर @Inherited के साथ एक एनोटेशन (उदा। @EnforceAuthor) बना सकते हैं और संकलन समय पर पकड़ने के लिए कंपाइलर एनोटेशन (जावा 1.6 के बाद) का उपयोग कर सकते हैं। फिर आपके पास उप-वर्ग का संदर्भ है और यह जांच सकता है कि कोई अन्य टिप्पणी (उदा। @Author)) गुम है या नहीं। यह एक त्रुटि संदेश के साथ संकलन रद्द करने की अनुमति देगा।

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

  • कोई संबंधित समस्या नहीं^_^