如何检测Java系统类?


问题内容

我试图将自定义行为添加到系统类(FileInputStream /
FileOutputStream)。我用以下转换方法编写了自定义ClassFileTransformer:

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

当我运行示例程序时:

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

我看到没有系统类没有传递给转换。

有什么办法可以修改系统类?提前致谢!


问题答案:

在调用pre-
main方法并添加ClassFileTransformer之前,已经加载了一些(不是全部)系统类。如果您还想转换这些类,则可以在添加ClassFileTransformer之后调用类似Instrumentation#retransformClasses(Instrumentation#getAllLoadedClasses())之类的方法。请注意,您必须使用Instrumentation#addTransformer(ClassFileTransformer,true)来指示您的转换器支持类的重新转换。