هل هناك طريقة للحصول على أي حصص ClassLoader وقد تحميلها ؟

StackOverflow https://stackoverflow.com/questions/1432180

سؤال

أنا أحاول تنفيذ بعض وحدة اختبار الإطار القديم.أنا محاولة للسخرية من طبقة قاعدة البيانات.للأسف إطار عملنا هو قديم و ليس باستخدام أفضل الممارسات لذلك ليس هناك فصل واضح من الشواغل.أنا قلق قليلا أن يحاول أن يسخر من طبقة قاعدة البيانات قد تجعل JVM تحميل عدد كبير من الفئات التي لن يتم استخدامها.

أنا لا أفهم حقا فئة لوادر جيدا حتى هذا قد لا يكون مشكلة.هل هناك طريقة لاتخاذ الذروة في جميع فئات معينة ClassLoader تحميل لإثبات ما يجري تحت غطاء محرك السيارة ؟

هل كانت مفيدة؟

المحلول

وحذر من أن يكون ذلك باستخدام

java -verbose

هل تنتج كمية هائلة من الانتاج. تسجيل الإخراج إلى ملف ثم استخدام البقرى. إذا كان لديك 'تي' مرشح قد تتمكن من محاولة هذا:

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

نصائح أخرى

ويمكنك إنشاء Classloader الخاصة بك واستخدام ذلك لتحميل خلال اختبار وحدة. هل لديك الخاصة بك Classloader العرف طباعة ما تقوم به.

وأو إذا كنت ترغب فقط في معرفة الطبقات التي يتم تحميلها، القيام به:

java -verbose:class

أنا لست متأكدا.ولكن هناك طريقة واحدة أرى أنه يمكن أن يكون القيام به.ربما overrly سخيفة على الرغم من.يمكنك محاولة الجوانب ووضع pointcut على loadclass.أيضا ربما jvm الحجة -مطول ربما من المفيد.

ووسيلة بديلة، لولا سيما من الدرجة الاولى محمل كما ذكرتم، يمكنك استخدام هذه التعليمات البرمجية المتكررة. مجرد تغيير قيمة المتغير الكائنات إذا كنت تريد.

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
    }
}

ويمكنك استخدام الخيار -Xlog لتكوين أو تمكين تسجيل مع آلة جافا الافتراضية (JVM) إطار تسجيل موحد. ميزة هو أنه يمكنك إرسال النتائج إلى ملف نصي

وخلاصة

-Xlog[:[what][:[output][:[decorators][:output-options [,...]]]]]
<اقتباس فقرة>   

في جملة التسجيل الموحد، -verbose:class يساوي -Xlog:class+load=info

وعلى سبيل المثال

java -Xlog:class+load=info:classloaded.txt

Ocarle وثيقة

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top