Инструментальный класс Java-системы с byteBuddy - PullRequest
0 голосов
/ 02 ноября 2018

Я новичок в bytebuddy. Я попытался перейти по ссылке здесь, чтобы использовать системный класс java, java.lang.String, но безуспешно. Ниже приведен код,

       AgentBuilder agentBuilder = new AgentBuilder.Default()
                .ignore(ElementMatchers.nameStartsWith("net.bytebuddy."))
                .enableBootstrapInjection(instrumentation, temp);
        agentBuilder
                .type(ElementMatchers.nameEndsWith(".String"))
                .transform(new AgentBuilder.Transformer() {
                    @Override
                    public DynamicType.Builder<?> transform(DynamicType.Builder<?> builder, TypeDescription typeDescription, ClassLoader classLoader, JavaModule javaModule) {
                        return builder.method(ElementMatchers.nameContains("toString")).intercept(MethodDelegation.to(MyInterceptor.class));
                    }
                }).installOn(instrumentation);


public static class MyInterceptor {

    public static String intercept(@SuperCall Callable<String> zuper) throws Exception {
        System.out.println("!!!!!!!!!!!!!!!!!!!!!!!!!!  Hacking!!!!!!!!!!!!!!!!!!!!!!!!!");
        return zuper.call();
    }
}

из журнала ByteBuddy, похоже, класс был преобразован.

[Byte Buddy] DISCOVERY java.lang.String [null, null, loaded=true]
[Byte Buddy] TRANSFORM java.lang.String [null, null, loaded=true]
[Byte Buddy] COMPLETE java.lang.String [null, null, loaded=true]

После инструментария, когда я вызываю toString, например,

system.out.println ("testString".toString());

Я ожидаю увидеть,

"!!!!!!!!!!!!!!!!!!!!!!!!!! Hacking!!!!!!!!!!!!!!!!!!!!!!!!!"
"testString" 

Однако я видел только

  "testString"

Пожалуйста, дайте мне знать, в чем проблема. Спасибо вперед.

...