2015-05-19 2 views
5

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

मेरे पास ओजेडीबीसी का उपयोग करके एक और प्रोजेक्ट है और मैं कक्षा के आधार पर क्वेरीज़ उत्पन्न करने के लिए अपनी लाइब्रेरी का उपयोग करने की कोशिश कर रहा हूं। हालांकि जब मैं अपने ओजेडीबीसी परियोजना से कक्षा उत्तीर्ण करता हूं तो सभी वर्ग की जानकारी का नुकसान होता है, कक्षा java.lang.Class के रूप में दिखाई दे रही है और यहां तक ​​कि एनोटेशन जानकारी भी खो जाती है। क्या कोई जानता है कि यह क्यों हो रहा है?

private static <T> void appendTableName(Class<T> cls) throws NotStorableException { 
    Storable storable = cls.getAnnotation(Storable.class); 
    String tableName = null; 
    if (storable != null) { 
     if ((tableName = storable.tableName()).isEmpty()) 
      tableName = cls.getSimpleName(); 
    } else {  
     throw new NotStorableException(
       "The class you are trying to persist must declare the Storable annotaion"); 
    } 
    createStatement.append(tableName.toUpperCase()); 
} 

cls.getAnnotation(Storable.class) जानकारी को खोने जब निम्नलिखित वर्ग यह

package com.fdm.ojdbc; 

import com.fdm.QueryBuilder.annotations.PrimaryKey; 
import com.fdm.QueryBuilder.annotations.Storable; 

@Storable(tableName="ANIMALS") 
public class Animal { 

@PrimaryKey 
private String name; 

public String getName() { 
    return name; 
} 

public void setName(String name) { 
    this.name = name; 
} 

} 

पशु वर्ग ojdbc परियोजना में है और appendTableName विधि मेरी क्वेरी बिल्डर के अंतर्गत आता है करने के लिए पारित हो जाता है है। मैंने क्वेरीबिल्डर परियोजना को एक जार में उत्पन्न करने का प्रयास किया है और इसे अपने भंडार में जोड़ने के लिए मैवेन इंस्टॉल का उपयोग किया है और अभी भी कोई भाग्य नहीं है।

त्वरित उत्तर के लिए धन्यवाद, हालांकि यह समस्या नहीं है क्योंकि मैंने जो एनोटेशन बनाया है, उसके पीछे रनटाइम पर प्रतिधारण सेट है।

package com.fdm.QueryBuilder.annotations; 

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

@Target(value = { ElementType.TYPE }) 
@Retention(value = RetentionPolicy.RUNTIME) 
public @interface Storable { 
    public String tableName() default ""; 
} 

मेरी एनोटेशन रनटाइम पर सेट है, फिर भी कक्षा की जानकारी अभी भी खो जा रही है।

+0

आपके द्वारा पोस्ट किया गया कोड काम करना चाहिए। यही कारण है कि कारण कहीं और है। क्या आप पूरी तरह से सुनिश्चित हैं कि कक्षा वस्तु पारित होने के साथ इस एनोटेशन के साथ एक वर्ग के अनुरूप है? (और नहीं, उदाहरण के लिए, कुछ रनटाइम उत्पन्न उपclass?) क्या आप सुनिश्चित हैं कि वर्ग को उस स्रोत से परिभाषित किया गया है जिसमें उस एनोटेशन है? (आप कक्षा के पुराने संस्करण के साथ नहीं चल रहे हैं जिसमें अभी तक एनोटेशन नहीं है, है ना?) – meriton

+0

नहीं, यह एनोटेशन के सही संस्करण के साथ चल रहा है और इस समय मैं उप-टाइप नहीं कर रहा हूं। कक्षा कोई संकलन त्रुटियों को फेंकता नहीं है और एनोटेशन का सही संदर्भ देता है। एनोटेशन एक जार में पैक किया गया है जिसे मैवेन निर्भरताओं के माध्यम से परियोजना में जोड़ा गया है। –

+1

... और आप सुनिश्चित हैं कि एनोटेशन क्लास रनटाइम क्लास पथ पर उपलब्ध है? (आप इसे देखकर सत्यापित कर सकते हैं कि 'class.forName ("com.whatever.Storable")' अपवाद नहीं फेंकता है) – meriton

उत्तर

5

जब आप एक एनोटेशन चाहते हैं जो रनटाइम पर प्रयोग योग्य है तो आपको इसे एनोटेशन जोड़ने की आवश्यकता है।

@Retention(RetentionPolicy.RUNTIME) 
public @interface Storable { 

इसके बिना, एनोटेशन रनटाइम पर दिखाई नहीं दे रहा है।

अधिक जानकारी के लिए, यहां इस एनोटेशन का स्रोत है।

/** 
* Indicates how long annotations with the annotated type are to 
* be retained. If no Retention annotation is present on 
* an annotation type declaration, the retention policy defaults to 
* {@code RetentionPolicy.CLASS}. 
* 
* <p>A Retention meta-annotation has effect only if the 
* meta-annotated type is used directly for annotation. It has no 
* effect if the meta-annotated type is used as a member type in 
* another annotation type. 
* 
* @author Joshua Bloch 
* @since 1.5 
* @jls 9.6.3.2 @Retention 
*/ 
@Documented 
@Retention(RetentionPolicy.RUNTIME) 
@Target(ElementType.ANNOTATION_TYPE) 
public @interface Retention { 
    /** 
    * Returns the retention policy. 
    * @return the retention policy 
    */ 
    RetentionPolicy value(); 
} 
+0

नीचे दिए गए कोड को देखें –

+0

मुझे पूरा यकीन नहीं है कि मैं क्या गलत कर रहा था कोड में कोई बदलाव नहीं है और अब यह ठीक चल रहा है। इनपुट के लिए धन्यवाद। –

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