2011-02-24 14 views
6

मैं डेटाबेस सिंक्रनाइज़ेशन के लिए ओआरएम विकसित करने की कोशिश कर रहा हूं और जावा प्रतिबिंब को जाने का फैसला किया। मैं एक पुस्तकालय है कि इसजावा कस्टम एनोटेशन और गतिशील लोडिंग

@Retention(RetentionPolicy.RUNTIME) 
@Target(ElementType.TYPE) 
@Inherited 
public @interface Synchronised { 
    String tableName(); 
    SynchronisationType synchronisationType(); 
} 

एंड्रॉयड परियोजना मैं एक मॉडल वर्ग

@Synchronised(tableName="UserAccounts", synchronisationType=SynchronisationType.DownloadOnly) 
public class UserAccount { 
    @SynchronisedField(fieldName="CompanyFk") 
    private int companyId; 
    @SynchronisedField(fieldName="Id") 
    private int userId; 
    @SynchronisedField(fieldName="Username") 
    private String username; 
    @SynchronisedField(fieldName="Password") 
    private String password; 
    @SynchronisedField(fieldName="Salt") 
    private String salt; 
    @SynchronisedField(fieldName="IsLocked") 
    private boolean isLocked; 
    @SynchronisedField(fieldName="HasMobileAccess") 
    private boolean hasMobileAccess; 
} 

कुछ जांच एक के बाद चिह्नित करने के लिए यह व्याख्या का उपयोग में तरह समन्वयित एनोटेशन को परिभाषित करता है है "लोडर" विधि अंत में लिखा गया था कि खोज की अनुमति देता है वर्तमान एपीके में मॉडल कक्षाएं। इसे "सिंक्रनाइज़" के रूप में चिह्नित सभी वर्गों को पुनर्प्राप्त करना चाहिए, लेकिन यहां समस्या यह है कि getAttribute (Synchronised.class) काम नहीं करता है। मैन्युअल रूप से एनोटेशन को पुन: सक्रिय करना और विशेषता (उदाहरण, इत्यादि) की खोज करना या तो काम नहीं करता है। डीबगिंग करते समय मैंने देखा कि प्रतिबिंब से आने वाली एनोटेशन वास्तव में एक प्रॉक्सी है (getClass() "कक्षा प्रॉक्सी 2" देता है, जबकि एनोटेशन। एनीोटेशन टाइप() सही नाम देता है) - यह बताता है कि मेरे पिछले प्रयासों में से कोई भी सफल क्यों नहीं हुआ। सीधे डालने की कोशिश करते समय - एक कास्ट अपवाद फेंक दिया जाता है (समझ में आता है)। असल में मैं यहां एक नुकसान में हूं इसलिए किसी भी विचार का स्वागत है।

मॉडल लोड हो रहा है विधि (पुस्तकालय परियोजना में):

public static List<Class> getModels(Context context, String packageName) 
     throws IOException, URISyntaxException, ClassNotFoundException, 
      NameNotFoundException { 

     String apkName = context.getPackageManager().getApplicationInfo(packageName, 0).sourceDir; 
     DexFile dexFile = new DexFile(apkName); 
     //PathClassLoader classLoader = new PathClassLoader(apkName, ClassLoader.getSystemClassLoader());  
     PathClassLoader classLoader = new PathClassLoader(apkName, Thread.currentThread().getContextClassLoader()); 

     List<Class> classes = new ArrayList<Class>(); 
     Enumeration<String> entries = dexFile.entries(); 

     while (entries.hasMoreElements()) { 

      String entry = entries.nextElement(); 
      // only check items that exist in source package and not in libraries, etc. 
      if (entry.startsWith(packageName)) { 
       Log.d(TAG, "Entry: " + entry); 

       Class<?> entryClass = classLoader.loadClass(entry);//dexFile.loadClass(entry, classLoader); 
       if (entryClass != null) { 
        Annotation[] annotations = entryClass.getAnnotations(); 
        for (Annotation annotation : annotations) { 
         if (annotation instanceof Synchronised) { 
          classes.add(entryClass); 
         } 
        } 
       } 
      }    
     } 

     return classes;  
    } 

[समाधान] वर्ग लोडर इस तरह श्रृंखलित करने की आवश्यकता है:

PathClassLoader classLoader2 = new PathClassLoader(apkName, Thread.currentThread().getContextClassLoader()); 
DexClassLoader classLoader = new DexClassLoader(apkName, new ContextWrapper(context).getCacheDir().getAbsolutePath(), null, classLoader2); 

आप अभी भी पता नहीं है कि मैं क्या कर रहा हूँ है, तो इस बारे में बात करते हुए, इस लंबी पोस्ट को पढ़ने के लिए धन्यवाद (-

उत्तर

2

केवल उस एनोटेशन प्राप्त करें जिसमें आप रुचि रखते हैं:

Annotation<Synchronised> annotation = entryClass.getAnnotation(Synchronised.class); 

अद्यतन:

समस्या यह है कि DexFile.getClass() जाहिरा तौर पर एक प्रॉक्सी देता है। ओपी ने उत्तरकर्ता पाया है और समाधान के साथ सवाल को अद्यतन किया है।

+0

आपको एनाटोटेशन का एक सामान्य संस्करण कहां मिला है? मैं केवल एनीमेशन (कक्षा) प्राप्त कर सकता हूं और नोट्स() प्राप्त कर सकता हूं। – Audrius

+0

ओह मेरा बुरा: यह एक सरणी वापस नहीं करता है। लेकिन यह कैसे हो सकता है - एक वर्ग में केवल एक एनोटेशन प्रकार सिंक्रनाइज़ किया जा सकता है: http://developer.android.com/reference/java/lang/Class.html#getAnotation(java.lang.Class ) –

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