2011-09-05 22 views
6

हमारे पास विशाल कोडबेस है और कुछ कक्षाओं को अक्सर पूरे कोड में प्रतिबिंब के माध्यम से उपयोग किया जाता है। हम कक्षाओं को सुरक्षित रूप से हटा सकते हैं और कंपाइलर खुश हैं, लेकिन उनमें से कुछ का उपयोग प्रतिबिंब का उपयोग करके गतिशील रूप से किया जाता है, इसलिए मैं उन्हें स्ट्रिंग्स खोजने के अलावा अन्यथा नहीं ढूंढ सकता ...जावा: प्रतिबिंब कोड उपयोग का पता लगाएं

क्या जावा कोड के लिए कुछ प्रतिबिंब एक्सप्लोरर है?

+0

कक्षाएं गतिशील किया जा रहा है कि वे किस तरह एक स्ट्रिंग के रूप में अपने पूरे नाम का उपयोग या एक स्क्रिप्ट है कि में इस्तेमाल किया जा रहा भरी हुई हैं रनटाइम पर मूल्यांकन करें? –

+0

स्ट्रिंग – Xorty

+0

के रूप में पूरा नाम यदि संभव हो तो ऐसा करने से बचें। जावा जैसी टाइपएफ़ भाषाएं इतनी शक्तिशाली हैं और एंटरप्राइज़ सिस्टम में उपयोग की जाती हैं कि संकलन समय प्रकार की जांच संकलन समय पर अधिकतर प्रकार के संघर्ष ढूंढ सकती है - सिवाय इसके कि यदि आप कुछ चीजों को करने के लिए प्रतिबिंब का उपयोग करते हैं - तो सभी शर्त बंद हैं और आप वापस आ गए हैं प्रोग्रामिंग की अंधेरी उम्र जहां आपका कोड 'खानों' के साथ एम्बेडेड होता है, जो किसी भी समय बंद हो सकता है जब आपके एक उपयोगकर्ता कोड के एक टुकड़े का प्रयोग करने के लिए होता है जिस तरह से आपने परीक्षण नहीं किया था। – Volksman

उत्तर

3

मेरा सुझाव है कहा जाता है, अपने JRE के लिए उचित रूप से लाइसेंस प्राप्त स्रोत का उपयोग, जब कक्षाएं प्रतिबिंब द्वारा किया जाता है लॉग इन करने के (एक नक्शा/WeakHashMap का उपयोग डुप्लिकेट अनदेखी करने के लिए) प्रतिबिंब वर्गों को संशोधित। आपकी संशोधित सिस्टम कक्षाएं rt.jar में -Xbootclasspath/p: के साथ कमांड लाइन पर (ओरेकल "सन" जेआरई पर, दूसरों को संभवतः कुछ समान होने पर प्रतिस्थापित कर सकती हैं)। अपने कार्यक्रम और परीक्षण चलाएं और देखें कि क्या आता है।

(संभवतः आप इस प्रणाली की कक्षाओं में आदेश वर्ग लोड हो रहा है के साथ मुद्दों के आसपास हैक करना पड़ सकता है।)

+0

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

+1

@ हेमल प्रकार निर्भर करता है कि किस प्रतिबिंब का उपयोग किया जा रहा है। प्रतिबिंब के अधिक उपयोगी उपयोगों में तारों को हार्डकोड नहीं किया जाएगा। यदि तारों को हार्डकोड किया जाता है, तो मैं 'java.lang.reflect' के लिए grepping का सुझाव देता हूं और प्रतिबिंब को हटा देता हूं। –

4

ऐसा करने के लिए कोई आसान उपकरण नहीं है। हालांकि आप इसके बजाय कोड कवरेज का उपयोग कर सकते हैं। यह क्या करता है आपको निष्पादित कोड की सभी पंक्तियों की एक रिपोर्ट देता है। यह परीक्षण कोड में सुधार या मृत कोड को हटाने में और भी उपयोगी हो सकता है।

प्रतिबिंब परिभाषा बहुत गतिशील है और आपको यह देखने के लिए सही कोड चलाना होगा कि यह क्या करेगा। यानी आपको उचित परीक्षण करना होगा। आप सबकुछ में लॉगिंग जोड़ सकते हैं प्रतिबिंब करता है यदि आप इस कोड तक पहुंच सकते हैं, या शायद आप इन पुस्तकालयों (या उन्हें सीधे बदल सकते हैं)

0

मुझे संदेह है कि ऐसी कोई भी उपयोग आसानी से उपलब्ध है, लेकिन मैं गलत हो सकता हूं।

यह काफी जटिल है, क्योंकि गतिशील रूप से लोड किए गए वर्ग (प्रतिबिंब के माध्यम से) स्वयं अन्य वर्गों को गतिशील रूप से लोड कर सकते हैं और लोड किए गए वर्गों के नाम चर या कुछ रनटाइम इनपुट से आ सकते हैं।

आपका कोडबेस शायद इनमें से कोई भी नहीं करता है। यदि यह एक बार प्रयास स्ट्रिंग खोज प्रयास एक अच्छा विकल्प हो सकता है। या आप प्रतिबिंब विधियों के लिए कॉल की तलाश करते हैं।

0

जैसा कि अन्य पोस्टर ने उल्लेख किया है, यह प्रतिबिंब की गतिशील प्रकृति के कारण स्थिर विश्लेषण के साथ नहीं किया जा सकता है। यदि आप ग्रहण का उपयोग कर रहे हैं, तो आपको यह कवरेज टूल उपयोगी हो सकता है, और इसके साथ काम करना बहुत आसान है। यह EclEmma

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