簡體   English   中英

使用ByteBuddy重新定義java.lang類

[英]Redefine java.lang classes with ByteBuddy

我正在嘗試使用ByteBuddy重新定義java.lang包(如String.class或Integer.class)上的類,但沒有成功。 我的問題是,如果可能的話?

這是我在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類? 這甚至可能嗎?

非常感謝。

是的,Byte Buddy可以重新定義任何類,但默認情況下,引導類會被忽略。 您可以通過定義自定義忽略匹配器或僅將其全部刪除來覆蓋此默認設置:

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

但是我強烈建議你不要搞亂引導類,尤其是String類。 很多代碼都對toString類做出了很強的假設。

重新定義類時,大多數JVM不允許您更改類文件格式,這就是您應該啟用.disableClassFormatChanges()選項的原因。 這樣做,你不能再添加方法或字段,這是你應該使用Advice類而不是標准攔截器。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM