2010-11-29 6 views
8

Ich versuche, Systemklassen benutzerdefiniertes Verhalten hinzuzufügen (FileInputStream/FileOutputStream). Ich schrieb benutzerdefinierte ClassFileTransformer mit dem Verfahren folgende Transformation:Wie Java-Systemklassen instrumentieren?

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

Wenn ich laufen Beispielprogramm:

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

Ich sehe, dass keine Systemklassen sind nicht zu verwandeln weitergegeben.

Gibt es eine Möglichkeit, Systemklassen zu ändern? Danke im Voraus!

+0

Ich hätte erwartet, dass Systemklassen übergeben werden, da viele Tools wie Profiler auf dieses Verhalten angewiesen sind. –

+0

Mehrere ClassFileTransformers können hinzugefügt werden, um Probleme mit vielen Tools zu vermeiden. Auch gibt es Standart/Richtlinie/Empfehlungen, wie Klassen umgewandelt werden – dernasherbrezon

Antwort

9

Einige (nicht alle) Systemklassen sind bereits geladen, bevor die pre-main-Methode aufgerufen und Ihr ClassFileTransformer hinzugefügt wird. Wenn Sie diese Klassen ebenfalls transformieren möchten, können Sie nach dem Hinzufügen Ihres ClassFileTransformers etwas wie Instrumentation # retransformClasses (Instrumentation # getAllLoadedClasses()) aufrufen. Beachten Sie, dass Sie Instrumentation # addTransformer (ClassFileTransformer, true) verwenden müssen, um anzugeben, dass Ihr Transformer die Rücktransformation von Klassen unterstützt.

+0

Bitte beachten Sie, dass Klasse überprüft werden sollte, ob es änderbar ist oder nicht: Instrumentation.isModifable – dernasherbrezon

+0

danke @jarnbjo, ich war auf der Suche nach etwas wie das - http: // stackoverflow .com/questions/20282619/using-instrumentation-to-record-unbehandelt-ausnahme/20283771 # 20283771 –