Есть ли способ вызвать метод по MethodDescription от перехватчика в ByteBuddy? - PullRequest
0 голосов
/ 21 сентября 2019

Я реализую агент, который заставляет загруженный класс неявно реализовывать интерфейс.Метод в интерфейсе, реализованный агентом, вызывает оригинальные методы класса, помеченные специальной аннотацией.Но оказывается, что в AgentBuilder.Transformer загруженный класс все еще не существует.Однако код внутри перехватчика выполняется после фактической загрузки класса.Таким образом, код внутри перехватчика может работать с методами класса.Могу ли я вызывать эти методы, используя MethodDescription объекты?

public class CustomTransformer implements AgentBuilder.Transformer {

    public static class InstantiateInterceptor {

        private final Collection<MethodDescription> methodDescription;

        InstantiateInterceptor(Collection<MethodDescription> methodDescription) {
            this.methodDescription = methodDescription;
        }

        public Object intercept(@This Object self) {
            //
            // Call method by descriptions somewhere here
            //
            return null;
        }
    }

    @Override
    public DynamicType.Builder<?> transform(
            DynamicType.Builder<?> builder,
            TypeDescription typeDescription,
            ClassLoader classLoader,
            JavaModule module) {

        try {

            List<MethodDescription> cacheableMethods =
                    typeDescription.getDeclaredMethods().stream()
                            .filter(t -> t.getDeclaredAnnotations()
                                    .isAnnotationPresent(EnhanceMarker.class))
                            .collect(Collectors.toList());

            return builder
                    .implement(HasField.class)
                    .define(HasField.class.getMethod("value"))
                    .intercept(MethodDelegation
                            .to(new InstantiateInterceptor(cacheableMethods)));
        } catch (NoSuchMethodException ex) {
            ex.printStackTrace();
        }

        return builder;
    }
}

Я мог бы, вероятно, получить метод из @This объекта по его имени.Но для этого требуется список типов параметров, и я могу получить только список ParameterDescription объектов класса, и он не возвращает типы аргументов.

1 Ответ

0 голосов
/ 24 сентября 2019

Если метод доступен в экземпляре @This, почему бы вам не вызвать его без отражения?Или этот метод генерируется?В этом случае определите сигнатуру в интерфейсе, реализуйте этот интерфейс и прочитайте экземпляр @This на этом интерфейсе.

Если вы хотите вызвать супер-методы, вы можете выполнить ту же поездку с аннотированным экземпляром.@Super, где Byte Buddy создает соответствующий прокси.

...