2016-03-20 4 views
0

Я ищу сказать, когда один конкретный метод в интерфейсе называется, учитывая простой интерфейс:Как сказать, когда метод в интерфейсе называется

public interface Foo { 
    String bar(); 
    int foobar(); 
} 

Я хочу, чтобы иметь возможность сделать что-то когда bar() вызывается в другом классе, но я хочу, чтобы другие классы реализовали Foo и @Override его методы.

Помните, что я не могу отредактировать класс Foo.

+0

Бар должен быть переопределен, чтобы быть вызванным. Почему бы не реализовать его при переопределении? –

+2

Что вы подразумеваете под «вы хотите сказать, когда bar() называется». Зачем вам это нужно? Я спрашиваю, потому что на самом деле нет чистого способа сделать это. Или, другими словами: очень вероятно, что ваш общий дизайн нарушен, если вы считаете, что вам нужна такая информация (во время выполнения). Поэтому, пожалуйста, скажите нам немного больше ... – GhostCat

+0

Вы можете сделать это с использованием аспектно-ориентированного программирования: http://aspects.jcabi.com/ и, в частности, что-то вроде аннотации «Loggable»: http://aspects.jcabi.com/ apidocs-0.22.3/com/jcabi/аспекты/Loggable.html –

ответ

0

Вы не можете, интерфейсы действительно слеп, и они не дают никакой возможности проверить, кто реализует свои методы ..

+0

Есть ли какое-то обходное решение? – Okx

+1

Нет; обходной путь скорее всего, что вы адаптируете свой дизайн к тому, что имеет смысл на языке Java. – GhostCat

1

Если вы хотите просто позвонить код до или после вызова реализации бар, я думаю, что это возможно за счет используя AOP (аспектно-ориентированное программирование) и AspectJ. Вы можете использовать эту тему: http://www.yegor256.com/2014/06/01/aop-aspectj-java-method-logging.html

+0

Я не могу редактировать класс 'Foo', и это не то, что мне нужно в любом случае. – Okx

+0

Да, но знаю, но с AspectJ вы можете пометить интерфейс и метод с помощью: @Around («Выполнение (* * (..)) && @annotation (Loggable)») – ust3000

+0

Вы создаете новый класс MethodLogger.java следующим образом: @Aspect общественного класса MethodLogger { @Around ("исполнение (* FOO.bar (..)) && @annotation (Loggable)") общественного объекта вокруг (ProceedingJoinPoint точка) {// код ... Возвращаемый результат; } } Чтобы вызвать исходный метод, bar(), совет должен вызвать continue() объекта точки соединения. Вы компилируете этот аспект и делаете его доступным в classpath вместе с нашим главным файлом Foo.class. – ust3000

0

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

Смежные вопросы