क्या मॉड्यूल दृश्यता नियमों को लागू करने के लिए कोई एनोटेशन प्रोसेसर है?

मेरे प्रोजेक्ट पर हमारे पास लगभग 20 अलग-अलग मॉड्यूल हैं जो अलग जार के रूप में पैक किए जाते हैं जिनमें से प्रत्येक जार फ़ाइलों में कुछ पैकेज होते हैं। उन पैक में से कुछ वर्ग सार्वजनिक हैं और इस प्रकार पैकेज के बाहर दिखाई देते हैं, भले ही कक्षाओं को मॉड्यूल के लिए निजी माना जाना चाहिए।

यह देखते हुए कि जावा मॉड्यूल सिस्टम में निर्मित नहीं है और मैं अपने आवेदन में ओएसजीआई शुरू नहीं करना चाहता हूं। मैं @ ओवरराइड एनोटेशन की तर्ज पर कुछ ढूंढ रहा हूं कि मैं यह कहने के लिए कि वे मॉड्यूल के लिए निजी हैं, प्रकारों पर चिपक सकते हैं। फिर कुछ एनोटेशन प्रोसेसर उन नियमों को लागू करें।

निम्नलिखित पंक्तियों के साथ कुछ।

   @ModuleDefinition
    public class FooModule{}//empty marker class so it can be referenced by other annotations

    @ModulePrivate(FooModule.class)
    public class SomePrivateFooModuleClas{}

    @ModulePublic(FooModule.class)
    public class SomePublicFooModuleClass{}

मान लें कि निम्न कोड एक और मॉड्यूल में स्थित है

   @ModuleDefinition
   public class BarModule{}

   //the annotation processor should generate an error on the import 
   //statement below because the class being imported is module private
   //and the class that the import belong to is not in the same module
    import com.example.SomePrivateFooModuleClass;

    @ModulePrivate(BarModule.class)
    public class SomePrivateBarModuleClas{
        SomePrivateFooModuleClass foo = ... etc    
    }

क्या कोई ओपन सोर्स लाइब्रेरी/एनोटेशन प्रोसेसर है जो ऊपर उल्लिखित लाइनों के साथ कुछ करता है।

क्या ऊपर उल्लिखित ऐसी योजना एक एनोटेशन प्रोसेसर द्वारा कार्यान्वित की जा सकती है या यह एनोटेशन प्रोसेसर को करने के लिए डिज़ाइन की गई क्षमताओं से परे है।

मुझे मॉड्यूल के रनटाइम अलगाव, या मॉड्यूल को रोकना और फिर से लोड करना, या किसी अन्य महान विशेषताओं को ओएसजीआई टेबल पर लाता है, मैं बस डेवलपर्स को दुर्घटना से मॉड्यूल निजी कक्षाओं का उपयोग नहीं करना चाहता हूं।

0
जोड़ा
विचारों: 2

1 उत्तर

I implemented something similar to what you are looking for. I did not use an annotation processor but used ASM to parse the class files. Check it out at http://www.jabsaw.org

मैंने आपके द्वारा रूपरेखा की तुलना में थोड़ा अलग दृष्टिकोण लिया: मॉड्यूल को खाली मार्कर कक्षाओं के रूप में भी परिभाषित किया जाता है, लेकिन एनोटेशन परिभाषित करता है कि कौन से वर्ग मॉड्यूल से संबंधित हैं (डिफ़ॉल्ट रूप से उसी पैकेज में सभी कक्षाएं)। इसके अलावा प्रत्येक मॉड्यूल परिभाषित करता है कि यह कौन से मॉड्यूल आयात करता है। आयातित मॉड्यूल से केवल कक्षाओं का उपयोग किया जा सकता है।

तो मेरा दृष्टिकोण निर्भरता संगठन की ओर अधिक उन्मुख है।

हालांकि, आप पार्सिंग कोड का पुन: उपयोग कर सकते हैं, या तो कॉपी/पेस्ट रास्ता या कुछ रिफैक्टरिंग के साथ।

अगर मैं आपको सही ढंग से समझता हूं, तो आपके मॉड्यूल वर्तमान में आपके जार द्वारा दर्शाए जाते हैं। पार्सिंग कोड का उपयोग करके, आप सभी जारों में सभी कक्षाओं को पार कर सकते हैं, वर्ग निर्भरताओं का निर्धारण कर सकते हैं और जार का ट्रैक रखते हुए कक्षा को पारदर्शी कर दिया गया था।

पैरामीटर के बिना @JarPrivate का उपयोग करके, आप तब जांच सकते हैं कि कोई वर्ग किसी अन्य जार से @JarPrivate क्लास का उपयोग करती है या नहीं।

यदि आप अभी भी रुचि रखते हैं तो मुझे बताएं, मुझे आपके लिए आवश्यक रिफैक्टरिंग करने में खुशी होगी।

0
जोड़ा