2012-03-30 3 views
1

Мне нужно перехватить вызовы ко всем вызовам метода в интерфейс. Я прошел через Java Dynamic Proxies, но это мне не поможет. Я даже не уверен, что этого можно добиться, но подумал о подтверждении.Java Перехват вызовов методу интерфейса

Так в основном позволяет сказать, что у меня есть интерфейс следующим образом:

public interface Foo {   
    public String getValue(); 
} 

Я хотел бы перехватывать все вызовы GetValue() из любого реализаций Foo. Проблема в том, что я не контролирую различные реализации Foo, из-за которых я не могу использовать Dynamic Proxies.

Есть ли способ, которым я могу это сделать?

Спасибо.

+0

Возможно, если вы используете Abstract.class вместо Interface, вы сможете реализовать частный метод, называемый каждым sub getValue() –

ответ

1

AOP может помочь, но, как вы обнаружили, все становится намного проще, если вы контролируете создание объекта (даже если это возможно с помощью рамки DI, например Spring или Guice).

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

Третьей альтернативой может быть поиск либо агента, либо пользовательского загрузчика классов, который будет выполнять переплетение при загрузке классов в систему. Это временное плетение. Но если вы находитесь, скажем, в веб-контейнере, где вы не полностью отвечаете за загрузчиков классов, это может быть сложно.

1

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

Это возможно можно будет сделать это из коробки с Spring AOP с перегрузкой во времени.

+0

Спасибо за ваш ответ. Все это выглядит слишком сложным для моего тривиального разума. Есть ли более простой пример, на который вы могли бы указать мне. – user320550