2010-11-29 16 views
8

Estoy tratando de agregar un comportamiento personalizado a las clases del sistema (FileInputStream/FileOutputStream). Escribí ClassFileTransformer personalizado con el siguiente método de la transformada:¿Cómo instrumentar las clases del sistema Java?

public byte[] transform(ClassLoader arg0, String arg1, Class arg2, ProtectionDomain arg3, byte[] arg4) throws IllegalClassFormatException { 
    System.out.println("class name: " + arg1); 
    return arg4; 
} 

Cuando programa de ejemplo corro:

public static void main(String[] args) throws Exception { 
    new FileOutputStream("file"); 
} 

veo que no hay clases de sistema no se pasan a transformarse.

¿Hay alguna manera de modificar las clases del sistema? ¡Gracias por adelantado!

+0

Hubiera esperado que se aprobaran las clases del sistema, ya que muchas herramientas como los profilers se basan en este comportamiento. –

+0

Se pueden agregar varios ClassFileTransformer para evitar problemas con muchas herramientas. También hay normas/lineamientos/recomendaciones sobre cómo transformar las clases – dernasherbrezon

Respuesta

9

Algunas (no todas) las clases del sistema ya están cargadas antes de que se invoca el método pre-main y se agrega su ClassFileTransformer. Si desea transformar estas clases también, puede invocar algo como Instrumentation # retransformClasses (Instrumentation # getAllLoadedClasses()) después de agregar su ClassFileTransformer. Tenga en cuenta que debe usar Instrumentation # addTransformer (ClassFileTransformer, true) para indicar que su transformador admite la retransformación de clases.

+0

Tenga en cuenta que la clase debe ser revisada si es modificable o no: Instrumentation.isModificable – dernasherbrezon

+0

gracias @jarnbjo, estaba buscando algo como esto - http: // stackoverflow .com/questions/20282619/using-instrumentation-to-record-unhandled-exception/20283771 # 20283771 –

Cuestiones relacionadas