ByteBuddy не сохраняет аннотацию метода, которая была динамически добавлена ​​через javassist - PullRequest
1 голос
/ 17 апреля 2019

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

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

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

Нопосле вызова 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

Добавление @ Наследуется в@interface ProtectionContext также не работает

1 Ответ

1 голос
/ 17 апреля 2019

Ответ на этот вопрос сам.

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

...