ByteBuddy не сохраняет аннотацию метода, которая была динамически добавлена через javassist

#byte-buddy

#byte-buddy

Вопрос:

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

Примечание: эта проблема не возникает, когда аннотация жестко запрограммирована в классе. Это происходит только тогда, когда аннотации добавляются динамически

Как вы можете видеть, аннотации правильно распознаются в сопоставителе, поэтому это означает, что byte buddy получил класс с аннотациями метода.

Но после вызова unloaded.load(…) аннотации метода нигде не найдены.

Я все перепробовал, но это не работает

                         ElementMatcher<MethodDescription> matcher = new 
                        ElementMatcher<MethodDescription>() {

                        @Override
                        public boolean matches(MethodDescription target) {

                            if (target.isAbstract()) {
                                return false;
                            }

                            for (AnnotationDescription a : target.getDeclaredAnnotations()) {
                                if (a.getAnnotationType().getTypeName().equals(ProtectionContext.class.getName())) {
                                    // System.out.println(target);
                                    return true;
                                }
                            }
                            return false;
                        }
                    };

                   Unloaded<?> unloaded = new ByteBuddy()
                            .with(AnnotationRetention.ENABLED)
                            .rebase(c)
                            .method(matcher)

                      .intercept(MethodDelegation.to(Interceptor.class)
                                 .andThen(SuperMethodCall.INSTANCE)
                       )
                            .make();


                Class<?> c = unloaded.load(...).getLoaded();

               // Annotation not found on c
 

Добавление @Inherited в @interface ProtectionContext также не работает

Ответ №1:

Отвечаю на это сам.

Метод перебазирования перегружен, чтобы принять ClassFileLocator, который должен быть указан для запроса измененного байт-кода формы Javassist