هل هناك طريقة للحصول على أي حصص ClassLoader وقد تحميلها ؟
-
07-07-2019 - |
سؤال
أنا أحاول تنفيذ بعض وحدة اختبار الإطار القديم.أنا محاولة للسخرية من طبقة قاعدة البيانات.للأسف إطار عملنا هو قديم و ليس باستخدام أفضل الممارسات لذلك ليس هناك فصل واضح من الشواغل.أنا قلق قليلا أن يحاول أن يسخر من طبقة قاعدة البيانات قد تجعل 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