Как подключить bytebuddy агент, когда целевые приложения загружают классы из uRLConnection.getInputStream - PullRequest
0 голосов
/ 06 декабря 2018

Я сделал Java-агент с bytebuddy.Он хорошо работает до тех пор, пока целевые классы загрузки приложения не будут иметь форму uRLConnection.getInputStream.Целевое приложение хорошо работает без вложения агента, но показывает исключение [java.lang.ClassNotFoundException], когда агент подключен.это строка загрузки приложения.

return this.getClass().getClassLoader().loadClass(string) //string points the name of a byte array.

В приложении классы предоставляются в виде байтового массива из uRLConnection.getInputStream во время выполнения, и приложение загружает их во время выполнения.Трассировка стека eclipst:

    [Byte Buddy] COMPLETE client [app.m@7dc3712, null, loaded=false]
Exception in thread "main" java.lang.NoClassDefFoundError: kh
    at java.lang.ClassLoader.defineClass1(Native Method)
    at java.lang.ClassLoader.defineClass(Unknown Source)
    at app.m.loadClass(m.java:22)
    at java.lang.ClassLoader.loadClass(Unknown Source)
    at app.appletviewer.b(appletviewer.java:1176)
    at app.appletviewer.a(appletviewer.java:454)
    at Launcher.main(Launcher.java:43)
Caused by: java.lang.ClassNotFoundException: kh
    at java.net.URLClassLoader.findClass(Unknown Source)
    at java.lang.ClassLoader.loadClass(Unknown Source)
    at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
    at java.lang.ClassLoader.loadClass(Unknown Source)
    at app.u.loadClass(u.java:79)
    at java.lang.ClassLoader.findSystemClass(Unknown Source)
    at app.m.loadClass(m.java:30)
    at java.lang.ClassLoader.loadClass(Unknown Source)
    ... 7 more

Мой агент:

 try {
        new AgentBuilder.Default()
                .with(new AgentBuilder.InitializationStrategy.SelfInjection.Eager())
                .with(AgentBuilder.Listener.StreamWriting.toSystemError())
                .type((ElementMatchers.any()))
                .transform((builder, typeDescription, classLoader, module) -> builder
                        .method(ElementMatchers.any())
                        .intercept(Advice.to(MyAdviser.class))
                ).installOn(instrumentation);
    } catch (Exception e) {
        return;
    }

Я также пытался

.transform(new AgentBuilder.Transformer.ForAdvice()
                        .include(MyAdviser.class.getClassLoader())
                        .advice(ElementMatchers.any(), MyAdviser.class.getName()))

Но, похоже, он не присоединен.

1 Ответ

0 голосов
/ 11 декабря 2018

Я думаю, что ваша проблема здесь может быть чем-то другим.Попробуйте вторую форму совета, которая позволяет избежать загрузки классов, когда загрузка класса системного класса на слишком ранней стадии, вероятно, является вашей проблемой в применении загруженного совета.Установите .ignore(none()) matcher для инструментария, чтобы заставить второй подход работать, поскольку классы загрузочной ленты, такие как URLConnection, не инструктируются Byte Buddy в конфигурации по умолчанию.

...