2009-09-16 13 views
12

Estoy tratando de implementar algunas pruebas unitarias para un marco antiguo. Estoy intentando burlarme de la capa de la base de datos. Lamentablemente, nuestro marco de trabajo es un poco antiguo y no está utilizando las mejores prácticas, por lo que no existe una clara separación de las preocupaciones. Estoy un poco preocupado de que intentar simular la capa de la base de datos haga que la JVM cargue una gran cantidad de clases que ni siquiera se usarán.¿Hay alguna forma de obtener las clases que ha cargado un ClassLoader?

Realmente no entiendo bien los cargadores de clase, así que esto podría no ser un problema. ¿Hay alguna manera de obtener un máximo en todas las clases que un ClassLoader en particular ha cargado para probar lo que sucede bajo el capó?

+0

¿Cómo se burlaría "hacer que la JVM cargue una gran cantidad de clases que ni siquiera se usarán"? –

Respuesta

15

ser advertidos de que el uso de

java -verbose 

producirá una cantidad enorme de salida. Registre la salida en un archivo y luego use grep. Si usted tiene el filtro de 'T' puede probar esto:

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

No estoy seguro. Pero hay una forma en que veo que se puede hacer. Aunque puede ser demasiado ridículo. Puede probar aspectos y poner un punto de corte para loadclass. También puede ser útil el argumento jvm -verbose.

35

Puede crear su propio Classloader y usarlo para cargarlo durante la prueba unitaria. Haga que su propio Classloader personalizado imprima lo que está haciendo.

O si lo que quiere saber qué clases se cargan, hacer:

java -verbose:class 
1

Como una forma alternativa, para una clase-loader particular, como usted ha mencionado, puede utilizar este fragmento de código. Simplemente cambie el valor de la variable obj si lo desea.

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