Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to instrument java system classes?

I'm trying to add custom behaviour to system classes (FileInputStream/FileOutputStream). I wrote custom ClassFileTransformer with the following transform method:

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

When I run sample program:

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

I see that no system classes are not passed to transform.

Is there any way to modify system classes? Thanks in advance!

like image 619
dernasherbrezon Avatar asked Nov 29 '10 10:11

dernasherbrezon


1 Answers

Some (not all) system classes are already loaded before the pre-main method is invoked and your ClassFileTransformer is added. If you want to transform these classes as well, you can invoke something like Instrumentation#retransformClasses(Instrumentation#getAllLoadedClasses()) after adding your ClassFileTransformer. Note, you have to use Instrumentation#addTransformer(ClassFileTransformer, true) to indicate that your transformer supports retransformation of classes.

like image 168
jarnbjo Avatar answered Oct 13 '22 00:10

jarnbjo