При использовании Advice of byte buddy, исключение java.lang.NoClassDefFoundError выбрасывается - PullRequest
0 голосов
/ 05 декабря 2018

По какой-то причине я анализировал свой собственный старый файл jar (к сожалению, исходный код был утерян).Я знаю, какую часть я найду, но не могу вспомнить, где это.Поэтому решите использовать байтовый компаньон, чтобы получить весь поток выполнения файла JAR.Достаточно зарегистрировать значения параметров и вернуть значения всех методов во всех классах (кроме библиотечного класса, например, java.lang. *).Я попробовал примеры кодов с небольшой модификацией, но за исключением только одного:

 public static void premain(final String agentArgs,
                           final Instrumentation inst) {
    System.out.println(
            "+++Hey, look: I'm instrumenting a freshly started JVM!");
    new AgentBuilder.Default()
            .type(ElementMatchers.any())
            .transform(new MetricsTransformer())
            .with(AgentBuilder.Listener.StreamWriting.toSystemOut())
            .with(AgentBuilder.TypeStrategy.Default.REDEFINE)
            .installOn(inst);
}

private static class MetricsTransformer implements AgentBuilder.Transformer {
    @Override
    public DynamicType.Builder<?> transform(
            final DynamicType.Builder<?> builder,
            final TypeDescription typeDescription,
            final ClassLoader classLoader,
            final JavaModule module) {

        final AsmVisitorWrapper methodsVisitor =
                Advice.to(EnterAdvice.class, ExitAdviceMethods.class)
                        .on(ElementMatchers.isAnnotatedWith(CollectMetrics.class)
                                .and(ElementMatchers.isMethod()));

        final AsmVisitorWrapper constructorsVisitor =
                Advice.to(EnterAdvice.class, ExitAdviceConstructors.class)
                        .on(ElementMatchers.isAnnotatedWith(CollectMetrics.class)
                                .and(ElementMatchers.isConstructor()));

        return builder.visit(methodsVisitor).visit(constructorsVisitor);
    }

    private static class EnterAdvice {
        @Advice.OnMethodEnter
        static long enter() {
            return System.nanoTime();
        }
    }

    private static class ExitAdviceMethods {
        @Advice.OnMethodExit(onThrowable = Throwable.class)
        static void exit(@Advice.Origin final Executable executable,
                         @Advice.Enter final long startTime,
                         @Advice.Thrown final Throwable throwable) {
            final long duration = System.nanoTime() - startTime;
            System.out.println(duration);;
        }
    }

}

Байт Бадди версии 1.9.5, 1.7.11 jdk версия: 1.8.0.191

иИсключение в cmd:

    E:\>cd E:\workshop\_android_studio\BounAgent\out\artifacts\BounAgent_jar

E:\BounAgent_jar>java -javaagent:BounAgent.jar -jar untitled.jar
Exception in thread "main" java.lang.NoClassDefFoundError: net/bytebuddy/matcher
/ElementMatcher
        at java.lang.Class.getDeclaredMethods0(Native Method)
        at java.lang.Class.privateGetDeclaredMethods(Unknown Source)
        at java.lang.Class.getDeclaredMethod(Unknown Source)
        at sun.instrument.InstrumentationImpl.loadClassAndStartAgent(Unknown Sou
rce)
        at sun.instrument.InstrumentationImpl.loadClassAndCallPremain(Unknown So
urce)
Caused by: java.lang.ClassNotFoundException: net.bytebuddy.matcher.ElementMatche
r
        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)
        ... 5 more

FATAL ERROR в нативном методе: обработка -javaagent не удалась

Заранее спасибо.

1 Ответ

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

Согласно статье я обнаружил:

Для запуска вашего агента вы должны объединить классы и ресурсы агента в jar, а в манифесте jar установить Agent-Свойство класса к имени вашего класса агента, содержащего метод premain.(Агент всегда должен быть связан как файл jar, его нельзя указывать в разобранном формате.)

Похоже, что файл JAR агента ("BounAgent.jar") не содержит всезависимости в правильной форме.В частности, классы bytebuddy отсутствуют в файле JAR.Это приводит к тому, что классы агентов не загружаются.

...