如何将类加载到正在运行的Java程序中


啊这回彻底死了
2025-01-05 05:15:35 (25天前)


这是我的Agent.jar的代码

公共类代理
{

public static void agentmain(String s,Instrumentation instrumentation)
{
尝试
{
ClassLoader classLoader = …

2 条回复
  1. 0# 敢嫁就敢娶 | 2019-08-31 10-32



    解析类中的引用时,将使用其定义的类加载器。您的代码标识了要监视的类的定义类加载器,然后,使用它作为父加载器创建一个新的类加载器。



    当你要求新的加载器加载你的类时,这些类很有可能



    已加载,但只能通过新创建的方式访问它们

    URLClassLoader

    。其他类加载器无法使用它们。



    使用包含对其他类的新依赖项的代码来检测类可能非常棘手。如果应用程序类加载器已加载检测类,则可以使用


    Instrumentation.appendToSystemClassLoaderSearch(JarFile)


    添加你的

    Cheat.jar

    到搜索路径,使类可用。



    对于其他加载器加载的类,事情变得更复杂。如果它们遵循标准的父委托模型,则可以使用


    appendToBootstrapClassLoaderSearch(JarFile)


    使您的类可用于所有这些类加载器。



    对于不遵循委托模型的装载机,您必须深入挖掘,例如使用带访问覆盖的Reflection来调用

    defineClass

    在它上面使该类可用。


登录 后才能参与评论