Перехват аннотированных вызовов методов без AOP - PullRequest
1 голос
/ 23 сентября 2011

Можно ли перехватить выполнение метода, аннотированного пользовательской аннотацией, без использования какой-либо инфраструктуры AOP, такой как AspectJ, Spring AOP, Guice и т. Д. Мне любопытно узнать, есть ли какие-либо из стандартныхДля этой цели можно использовать java apis (например, Reflection).

Спасибо.

Ответы [ 3 ]

1 голос
/ 23 сентября 2011

Вы не можете напрямую перехватывать вызовы методов существующих методов, не подключаясь, например, к логике реализации. Один из подходов состоит в том, чтобы разделить логику реализации на фабрику, которая может использовать, например, Proxy .

public class FooFactry() {
     private InvocationHandler handler;

     public FooFactory(InvocationHandler handler) {
         this.handler = handler;
     }

     public Foo newInstance() {
        return (Foo) Proxy.newProxyInstance(Foo.class.getClassLoader(),
                              new Class[] { Foo.class },
                              handler);
     }
}

Вы можете использовать пользовательский InvocationHandler для перехвата любого метода, выданного Foo. Вы также можете создать свою собственную оболочку, чтобы избежать динамических прокси, class FooWrapper extends Foo{} для достижения того же результата.

0 голосов
/ 23 сентября 2011

Вы можете использовать отражение для вызова методов, но вы не можете использовать его для перехвата вызовов методов. Аналогично, вы можете создавать прокси с динамическими обработчиками вызовов с классом Proxy, но вы не можете перехватить существующий код, который не нацелен на прокси.

Так что ответ - нет.

0 голосов
/ 23 сентября 2011

Это невозможно сделать с помощью отражения, поскольку не обеспечивает никакого контроля над выполнением.Но вы можете написать свой собственный агент .Вам нужно будет использовать классы инструментов, что может быть проще, используя что-то вроде BCEL Это очень много с фреймворком Java и кошерным.

...