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

重新定义java。使用ByteBuddy的lang类

孔琪
2023-03-14

我试图在java上重新定义类。lang包,如String。类或整数。使用ByteBuddy初始化,但没有成功。我的问题是这是否可能?

这是我在我的java代理中尝试的代码:

public static void premain(String agentArgs, Instrumentation inst) {
    new AgentBuilder.Default()
            .type(named("java.lang.String"))
            .transform((builder, typeDescription, classLoader) ->
                    builder.method(named("toString"))
                            .intercept(FixedValue.value("toString() got hacked!")))
            .with(AgentBuilder.Listener.StreamWriting.toSystemOut())
            .with(AgentBuilder.RedefinitionStrategy.REDEFINITION)
            .with(AgentBuilder.TypeStrategy.Default.REDEFINE)
            .installOn(inst);
}

当我检查日志的输出时,我看到的关于String类的内容是:

[Byte Buddy] IGNORE [[Ljava.lang.String; [null, null]
[Byte Buddy] COMPLETE [[Ljava.lang.String; [null, null]

这是否意味着ByteBuddy没有重新定义String类?这可能吗?

非常感谢。

共有1个答案

云俊名
2023-03-14

是的,Byte Buddy可以重新定义任何类,但默认情况下,将忽略引导类。您可以通过定义自定义忽略匹配器或将其一起删除来覆盖此默认设置:

AgentBuilder agentBuilder = new AgentBuilder.Default().ignore(none());

然而,我强烈建议您不要乱搞引导类,尤其是String类。很多代码对toString类做出了强烈的假设。

大多数JVM不允许您在重新定义类时更改类文件格式,这就是为什么您应该启用<代码>。disableClassFormatChanges()选项。这样,您就不能再添加方法或字段了,此时您应该使用Advice类而不是标准的拦截器。

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

  • homebody能帮我提示一下如何使用byte buddy 1.6.9重新定义静态方法吗? 我试过这个: 我遇到以下异常: 线程“main”java.lang.IllegalStateException中的异常:无法注入已经加载的类型:类委托。来源 谢谢

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

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

  • 问题内容: 我希望在下面的代码中调用newTarget.a()和newTarget.b()时应用调制后的ASM类,以便它看起来像这样 当调用应用了修改的ASM类的newTarget.a()和newTarget.b()时,如何获得以下结果? 码: 想要结果: 第一种方法 第二种方法 转换方法 第一种方法 转换方法 第二种方法 问题答案: 您正在寻找Java API 。它要求您通过参数附加Java代理

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