如何对Java系统类进行仪表化?

9

我正在尝试为系统类(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");
}

我看到没有传递系统类来进行转换。

有没有办法修改系统类呢?提前感谢!


我本来期望系统类被传递,因为许多工具都依赖于这种行为。 - Peter Lawrey
可以添加多个ClassFileTransformer以避免与许多工具出现问题。此外,还有关于如何转换类的标准/指南/建议。 - dernasherbrezon
1个回答

10

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


请注意,应检查类是否可修改:Instrumentation.isModifiable - dernasherbrezon
谢谢@jarnbjo,我正在寻找类似这样的东西 - https://dev59.com/ennZa4cB1Zd3GeqPtLLe#20283771 - Satheesh Cheveri

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接