当前位置: 首页 > 知识库问答 >
问题:

使用ByteBuddy重新定义静态方法

周作人
2023-03-14

homebody能帮我提示一下如何使用byte buddy 1.6.9重新定义静态方法吗?

我试过这个:

public class Source {
    public  static String hello(String name) {return null;}
}


public class Target {
    public static String hello(String name) {
        return "Hello" + name+ "!";
    }
}
String helloWorld = new ByteBuddy()
                .redefine(Source.class)               
                .method(named("hello"))
                .intercept(MethodDelegation.to(Target.class))
                .make()
                .load(getClass().getClassLoader())
                .getLoaded()
                .newInstance()
                .hello("World");

我遇到以下异常:

线程“main”java.lang.IllegalStateException中的异常:无法注入已经加载的类型:类委托。来源

谢谢

共有1个答案

董小林
2023-03-14

每个类加载器只能加载一次类。为了替换方法,您需要使用Java代理来连接到JVM的HotSwap特性。

Byte Buddy提供了使用此类代理的类加载策略,使用:

.load(Source.class.getClassLoader(), 
      ClassReloadingStrategy.fromInstalledAgent());

但是,这确实需要您安装Java代理。在JDK上,您可以通过ByteBuddyAgent.install()(包含在byte-party-agent工件中)以编程方式完成此操作。在JVM上,您必须在命令行上指定代理。

 类似资料:
  • 我试图重新定义简单的非静态方法,但遇到了一个例外: 类别: 电话: 上面的类是scala类,但它们编译为标准的java类。 如何正确地重新定义方法?

  • 无法使用ByteBuddy重新定义java.io.ObjectInputStream。 我已经尝试了很多方法来解决这个问题。但我找不到钩住“java.io.ObjectInputStream$resolveClass”的方法。你能帮助我吗?

  • 我试图在java上重新定义类。lang包,如String。类或整数。使用ByteBuddy初始化,但没有成功。我的问题是这是否可能? 这是我在我的java代理中尝试的代码: 当我检查日志的输出时,我看到的关于String类的内容是: 这是否意味着ByteBuddy没有重新定义String类?这可能吗? 非常感谢。

  • 我目前正在尝试使用ByteBuddy作为java bean实现包装键/值对的,将map键公开为普通getter/setter。 我最初按照如下方式构造生成器,允许我将

  • 我正在用bytebuddyapi编写一个Java代理。因此,我想了解使用Bytebuddy DSL的重传功能加载的类的方法委派。当我使用参数javaagent启动应用程序时,一切正常,控制台输出也会更改,但当在运行时附加java代理时,会执行agentmain方法,但控制台输出不会更改。也许我错过了一些进一步的ByteBuddy配置。任何帮助都将不胜感激! 这是代理代码: 以下是应用程序代码: 这

  • 字节伙伴代理是否能够克服附加API限制,例如“新方法定义”、“静态变量更改”?我可以看到,正在从代理生成器调用重定义类方法,但不确定这是否也遵循与附加API相同的限制。 我试图了解我是否可以做到以下几点: 1) 使用应用程序类加载器加载代理jar,例如并行WebAppClassLoader。我的应用程序是一个servlet webapp,在运行时它使用上面的类加载器加载所有应用程序类。 2) 完全