2009-09-16 20 views
12

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

मैं कक्षा लोडरों को वास्तव में समझ में नहीं आता हूं, इसलिए यह कोई समस्या नहीं हो सकती है। क्या सभी कक्षाओं में एक चोटी लेने का कोई तरीका है जो एक विशेष क्लासलोडर ने हुड के नीचे क्या चल रहा है यह साबित करने के लिए लोड किया है?

+0

"जेवीएम लोड को बड़ी संख्या में कक्षाओं का उपयोग करने के लिए कैसे उपयोग नहीं किया जाएगा" का मज़ाक उड़ाएगा? –

उत्तर

15

चेतावनी दी जानकारी होनी चाहिए कि

java -verbose 

का उपयोग कर उत्पादन का एक विशाल राशि का उत्पादन करेगा। एक फ़ाइल में आउटपुट लॉग करें और फिर grep का उपयोग करें। एक वैकल्पिक तरीका के रूप में

java -verbose | tee classloader.log 
grep class classloader.log 
2

मुझे यकीन नहीं है। लेकिन एक तरीका है जो मुझे लगता है कि यह किया जा सकता है। हालांकि यह शायद हास्यास्पद हास्यास्पद है। आप पहलुओं को आजमा सकते हैं और लोडक्लास के लिए पॉइंटकट डाल सकते हैं। शायद जेवीएम तर्क -verbose शायद सहायक हो सकता है।

35

आप अपना खुद का क्लासलोडर बना सकते हैं और इकाई परीक्षण के दौरान लोड करने के लिए इसका उपयोग कर सकते हैं। अपना खुद का कस्टम क्लासलोडर प्रिंट करें कि यह क्या कर रहा है।

या यदि आपने अभी पता करने के लिए जो कक्षाओं लोड किए गए हैं चाहते हैं, करते हैं:

java -verbose:class 
1

, एक विशेष कक्षा-लोडर आप का उल्लेख के रूप में के लिए, तो आप इस कोड का उपयोग कर सकते हैं: आप 'टी' फिल्टर है, तो आप इस की कोशिश कर सकते। यदि आप चाहें तो ओबीजे वैरिएबल के मूल्य को बस बदलें।

Object obj = this; 
ClassLoader classLoader = obj.getClass().getClassLoader(); 
File file = new File("classloderClasses.txt"); 
if (file.exists()) { 
    file.delete(); 
} 
if (classLoader != null) { 
    try { 
     Class clClass = classLoader.getClass(); 
     while (clClass != ClassLoader.class) { 
      clClass = clClass.getSuperclass(); 
     } 
     java.lang.reflect.Field classesField = clClass.getDeclaredField("classes"); 
     classesField.setAccessible(true); 
     Vector classes = (Vector) classesField.get(classLoader); 
     FileOutputStream fos = new FileOutputStream("classloderClasses.txt", true); 
     fos.write(("******************** " + classLoader.toString() + " ******************** " + "\n").getBytes()); 
     fos.write(Arrays.toString(classes.toArray()).getBytes()); 
     fos.close(); 
    } catch (Exception exception) { 
     exception.printStackTrace(); 
     // TODO 
    } 
} 
संबंधित मुद्दे

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