Переопределить классы java.lang с помощью ByteBuddy

Я пытаюсь переопределить классы в пакете java.lang, например String.class или Integer.class, используя 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? Это вообще возможно?

Большое спасибо.


person João Dias Amaro    schedule 04.11.2016    source источник


Ответы (1)


Да, Byte Buddy может переопределить любой класс, но по умолчанию классы начальной загрузки игнорируются. Вы можете переопределить этот параметр по умолчанию, определив собственный сопоставитель игнорирования или просто удалив его полностью:

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

Однако я настоятельно рекомендую вам не связываться с классами начальной загрузки и особенно с классом String. Много кода делает серьезные предположения о классе toString.

Большинство JVM не позволяют вам изменять формат файла класса при переопределении классов, поэтому вам следует включить параметр .disableClassFormatChanges(). При этом вы больше не сможете добавлять методы или поля, и тогда вам следует рассмотреть возможность использования класса Advice вместо стандартных перехватчиков.

person Rafael Winterhalter    schedule 06.11.2016