当目标应用程序从uRLConnection.getInputStream加载类时,如何附加字节预算代理

时间:2018-12-06 03:33:47

标签: byte-buddy classloading

我用bytebuddy制作了一个Java代理。在目标应用程序加载类从uRLConnection.getInputStream生成之前,它可以正常工作。目标应用程序在不附加代理的情况下运行良好,但是在附加代理时显示异常[java.lang.ClassNotFoundException]。 这是应用程序的类加载行。

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

在应用程序中,类在运行时从uRLConnection.getInputStream以字节数组的形式提供,并且应用程序在运行时加载那些类。 eclipst stacktrace:

    [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 :(得分:0)

我认为您的问题可能在这里。尝试第二种形式的建议,避免类加载,而在过于成熟的阶段中系统类的类加载可能是应用已加载建议的问题。为检测设置.ignore(none())匹配器,以使第二种方法起作用,因为默认配置中,Byte Buddy不会检测诸如URLConnection之类的引导带类。