解析类中的引用时,将使用其定义的类加载器。您的代码标识了要监视的类的定义类加载器,然后,使用它作为父加载器创建一个新的类加载器。
当你要求新的加载器加载你的类时,这些类很有可能
是
已加载,但只能通过新创建的方式访问它们
URLClassLoader
。其他类加载器无法使用它们。
使用包含对其他类的新依赖项的代码来检测类可能非常棘手。如果应用程序类加载器已加载检测类,则可以使用
Instrumentation.appendToSystemClassLoaderSearch(JarFile)
添加你的
Cheat.jar
到搜索路径,使类可用。
对于其他加载器加载的类,事情变得更复杂。如果它们遵循标准的父委托模型,则可以使用
appendToBootstrapClassLoaderSearch(JarFile)
使您的类可用于所有这些类加载器。
对于不遵循委托模型的装载机,您必须深入挖掘,例如使用带访问覆盖的Reflection来调用
defineClass
在它上面使该类可用。