0

我用 bytebuddy 做了一个 java 代理。在目标应用程序加载类形成 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()))

但是好像没有绑定。

4

1 回答 1

0

我认为您的问题可能是这里的其他问题。尝试避免类加载的第二种形式的建议,其中系统类的类加载在太早的阶段可能是您在应用加载建议时的问题。为检测设置一个.ignore(none())匹配器,以使第二种方法工作,因为像 URLConnection 这样的引导类在默认配置中不是由 Byte Buddy 检测的。

于 2018-12-11T08:30:41.150 回答