Bytebuddy конструктор советует бросает java.lang.VerifyError - PullRequest
0 голосов
/ 01 мая 2019

По сути, я хочу перехватить все классы, которые имеют конкретную аннотацию (которая была создана мной), и я хочу выполнить свою собственную логику в записи метода и конструктора.

Я пытался использовать byte-buddyПостроитель агентов, как вы можете видеть из моего примера кода.

public static void agentmain(final String agentArgs,
                             final Instrumentation inst) {
new AgentBuilder.Default()
        .type(ElementMatchers. 
<TypeDescription>isAnnotatedWith(Licensable.class))
        .transform((builder, td, cl, m) -> builder
        .visit(Advice.to(AdviceToClasses.class).on(isMethod()))    
        .visit(Advice.to(AdviceToConstructor.class).on(isConstructor())))
        .installOn(inst);
}

Класс AdviceToConstructor

@Advice.OnMethodEnter
public static void enter(@Advice.Origin Constructor method) throws 
Exception {
    System.out.println("Intercepted Constr >> " + method);
}

Используя выше, я могу получить то, что ожидал, если воспользуюсь советом методаи оставить часть конструктора.Но когда я использую часть конструктора, это не идет к методу ввода рекомендации, и я получаю следующие ошибки:


    complete --- sample.TestAnnotation
    complete --- java.lang.VerifyError
    Exception in thread "main" complete --- java.lang.Throwable$WrappedPrintStream
    complete --- java.lang.Throwable$PrintStreamOrWriter
    complete --- java.util.IdentityHashMap$KeySet
    java.lang.VerifyError: Inconsistent stackmap frames at branch target 96
    Exception Details:
      Location:
        sample/TestAnnotation.()V @96: aload_0
      Reason:
        Type uninitializedThis (current frame, locals[0]) is not assignable to 'sample/TestAnnotation' (stack map, locals[0])
      Current Frame:
        bci: @93
        flags: { flagThisUninit }
        locals: { uninitializedThis, 'sample/annotation/Licensable' }
        stack: { }
      Stackmap Frame:
        bci: @96
        flags: { }
        locals: { 'sample/TestAnnotation' }
        stack: { }
      Bytecode:
        0x0000000: b200 02bb 0028 59b7 0029 122b b600 2f12
        0x0000010: 0703 bd00 31b6 0035 b600 38b6 003c b600
        0x0000020: 04b2 0002 123e b600 0412 0703 bd00 31b6
        0x0000030: 0035 b600 4412 46b6 004a c000 464c 2bc6
        0x0000040: 001e b200 502b b900 5301 00b6 0059 3d1c
        0x0000050: 9a00 0dbb 005b 5912 5db7 005f bfa7 0003
        0x0000060: 2ab7 0001 b1                           
      Stackmap Table:
        append_frame(@93,Object[#70])
        full_frame(@96,{Object[#7]},{})

        at sample.Sample.main(SampleApp.java:47)
    complete --- java.util.IdentityHashMap$KeyIterator
    complete --- java.util.IdentityHashMap$IdentityHashMapIterator

Я проверил сообщения в StackOverflow и погуглил их, но не смог найти решение.Любой совет относительно этой ошибки?

...