Вызвать метод перед аннотацией другого

Я пытаюсь добавить функциональность в сигнатуру метода интерфейса с помощью аннотаций.

идея состоит в том, чтобы вызывать некоторые другие методы для каждого аннотированного.

например, если у меня есть подпись этого метода:

public interface IMyInterface{

    @Entity(visibileName = "Name")
    public TextField getName();
}

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

Я также открыт для структурных изменений.

Я не уверен, что все, что вы пытаетесь сделать, можно сделать таким образом, но вы можете взглянуть на АОП.

Stultuske 12.03.2019 09:00
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
1
117
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Если вы хотите аннотировать методы interface, то это возможен без АОП.
Просто используйте Динамические прокси!

База interface для реализации прокси InvocationHandler

InvocationHandler is the interface implemented by the invocation handler of a proxy instance.


Следите за комментариями в коде.

static class MyInterfaceProxy implements InvocationHandler {
    private static final Map<String, Method> METHODS = new HashMap<>(16);

    static {
        // Scan each interface method for the specific annotation
        // and save each compatible method
        for (final Method m : IMyInterface.class.getDeclaredMethods()) {
            if (m.getAnnotation(YourAnnotation.class) != null) {
                METHODS.put(m.getName(), m);
            }
        }
    }

    private final IMyInterface toBeProxied;

    private MyInterfaceProxy(final IMyInterface toBeProxied) {
        // Accept the real implementation to be proxied
        this.toBeProxied = toBeProxied;
    }

    @Override
    public Object invoke(
            final Object proxy,
            final Method method,
            final Object[] args) throws InvocationTargetException, IllegalAccessException {
        // A method on MyInterface has been called!
        // Check if we need to call it directly or if we need to
        // execute something else before!
        final Method found = METHODS.get(method.getName());

        if (found != null) {
            // The method exist in our to-be-proxied list
            // Execute something and the call it
            // ... some other things
            System.out.println("Something else");
        }

        // Invoke original method
        return method.invoke(toBeProxied, args);
    }
}

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

Допустим, у вас есть Фабрика для MyInterface реализаций.

MyInterface getMyInsterface() {
   ...
   final MyInterface instance = ...

   // Create the proxy and inject the real implementation
   final IMyInterface proxy = (IMyInterface) Proxy.newProxyInstance(
        MyInterfaceProxy.class.getClassLoader(),
        new Class[] {IMyInterface.class},
        new MyInterfaceProxy(instance) // Inject the real instance
    );

   // Return the proxy!
   return proxy;
}

Proxy.newProxyInstance, можете ли вы дать мне полную реализацию этого метода? какое полное имя для этого класса, что такое файл jar?

Ali Taha 12.03.2019 10:08

@AliTaha Это стандартный метод в JDK. Уже сделано!

LppEdd 12.03.2019 10:10

Другие вопросы по теме