2012-03-23 10 views
5

के लिए काम नहीं कर रहा है मेरे पास कक्षा फ़ाइल test.class है। उस फ़ाइल में @Id और @Entity के रूप में एनोटेशन हैं। लेकिन जब मैं field.isAnnotationPresent(Id.class) विधि के साथ एनोटेशन की जांच करता हूं, तो यह false देता है। मैं फ़ील्ड चर में सभी फ़ील्ड प्राप्त कर रहा हूं।क्यों एनाटेशन प्रस्तुति (Id.class) कक्षा फ़ाइल

क्या कोई भी शरीर मुझे बता सकता है कि मैंने क्या गलती की।

अद्यतन: निम्नलिखित कोड का उपयोग कर रहा वर्ग

File file=new File("D:/test/"); 
URL url=file.toURL(); 
URL[] urls=new URL[]{url}; 
ClassLoader loader=new URLClassLoader(urls); 
Class cls=loader.loadClass("com.net.test.Test"); 
+0

क्या आप हमें वह कोड दिखा सकते हैं जो आपके लिए काम नहीं कर रहा है? –

उत्तर

1

आपका परीक्षण के classloader एक अलग Idloader से की हो सकती है।

एक त्वरित तरीका जाँच करने के लिए: - अधिक विशेष रूप से, अपने अपने परीक्षण मामले के loader का उपयोग नहीं करता लोडर

... 
Class idType = loader.loadClass("my.package.Id"); 
... 
field.isAnnotationPresent(idType); 

अगर वह काम करता है, तो आप एक classloader समस्या है। ठीक करने के लिए, एक अलग निर्माता का उपयोग करें:

ClassLoader loader = new URLClassLoader(urls, this.getClass().getClassLoader()); 
+0

आप सही हैं मैंने क्लासलोडर कन्स्ट्रक्टर को बदल दिया.अब यह पूरी तरह से काम कर रहा है आपको बहुत धन्यवाद। – elvisanandkumar

1

यह सामान्य रूप में काम करता है पाने के लिए। यहां एक कामकाजी उदाहरण दिया गया है:

import java.lang.reflect.Field; 

public class AnnotationTest { 

    @Deprecated 
    public static int value = 1; 

    public static void main(String[] args) throws Exception { 
     Field field = AnnotationTest.class.getField("value"); 
     System.out.println(field.isAnnotationPresent(Deprecated.class)); 
    } 
} 

अपने क्लासनाम और आयात को दोबारा जांचें। हो सकता है कि आप गलती से गलत Id.class (नामक्लैश) की जांच करें।

25

क्या आपने अपनी एनोटेशन को अवधारण नीति के साथ एनोटेट किया है? यदि कोई प्रतिधारण नीति सेट नहीं है तो डिफ़ॉल्ट प्रतिधारण नीति व्यवहार यह है कि एनोटेशन संकलक द्वारा पढ़ा जाता है और जेनरेट की गई .class फ़ाइलों में भी बनाए रखा जाता है लेकिन रनटाइम के दौरान यह एक्सेसिबल नहीं होगा। आप क्रम में एनोटेशन की जरूरत है आप के साथ अपनी टिप्पणियों को टिप्पणी करने की जरूरत है:

@Retention(RetentionPolicy.RUNTIME) 
+0

'@ आईडी' और' @ Entity' * क्या * 'retentionPolicy.RUNTIME' – skaffman

+0

है क्या यह जेपीए एनोटेशन है? –

+1

धन्यवाद, मैं अपने कोड में retentionpolicy लापता था और इसी तरह की समस्या में चल रहा था। – Keshav

0

आप स्प्रिंग AOP इंटरसेप्टर और proxyTargetClass = false में isAnnotationPresent() का उपयोग करते हैं, लक्ष्य इंटरफेस के बजाय कार्यान्वयन वर्ग पर टिप्पणी जोड़ने।

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