2010-11-29 7 views
8

J'essaie d'ajouter un comportement personnalisé aux classes système (FileInputStream/FileOutputStream). J'ai écrit ClassFileTransformer personnalisé avec la méthode de transformation suivante:Comment instrumenter les classes système Java?

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

Quand je lance le programme d'échantillonnage:

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

Je vois que pas de classes de système ne sont pas transmises à transformer.

Y a-t-il un moyen de modifier les classes système? Merci d'avance!

+0

Je m'attendais à ce que des classes système soient passées car de nombreux outils comme les profileurs reposent sur ce comportement. –

+0

Plusieurs ClassFileTransformer pourraient être ajoutés pour éviter les problèmes avec de nombreux outils. Il ya aussi standart/guideline/recommandations sur la façon de transformer les classes – dernasherbrezon

Répondre

9

Certaines classes système (pas toutes) sont déjà chargées avant l'appel de la méthode pré-principale et l'ajout de ClassFileTransformer. Si vous voulez également transformer ces classes, vous pouvez appeler quelque chose comme Instrumentation # retransformClasses (Instrumentation # getAllLoadedClasses()) après avoir ajouté votre ClassFileTransformer. Notez que vous devez utiliser Instrumentation # addTransformer (ClassFileTransformer, true) pour indiquer que votre transformateur prend en charge la retransformation des classes.

+0

Veuillez noter que la classe doit être vérifiée si elle est modifiable ou non: Instrumentation.isModifiable – dernasherbrezon

+0

merci @jarnbjo, je cherchais quelque chose comme ça - http: // stackoverflow .com/questions/20282619/using-instrumentation-to-record-unhandled-exception/20283771 # 20283771 –

Questions connexes