2016-09-22 2 views
1

Я пытаюсь реализовать пользовательскую аннотацию, которая выглядит примерно так:Java аннотаций для вызова другого метода перед вызовом аннотированного метода

public class Foo{ 

@CustomAnnotation(classname="com.somepackage.ExternalClass", methodname="method1", invokation="before") 
public void bar(){ 
    //method body.. 
    } 
} 

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

+0

IMO, что вы здесь делаете, не делает много смысла. Вы пытаетесь повторно реализовать вещи, которые вы можете сделать намного проще с помощью AOP. Но если вы используете АОП, почему бы вам загрязнить ваш основной код приложения информацией о том, как применять сквозные проблемы? Чистым решением было бы полностью нарудить эту информацию в самих аспектах и ​​избавиться от магии отражения. Просто дайте мне знать, если вы хотите увидеть простой пример AspectJ того, о чем я говорю. – kriegaex

ответ

1

Что вы пытаетесь достичь здесь? Почему бы вам просто не вызвать метод из тела метода?

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

Единственное, что вы могли бы сделать для этого, это то, что вы только вызываете этот метод из одного места, вы можете использовать отражение, чтобы проверить эту аннотацию и вызвать метод (опять же, используя отражение для вызова метода), аналогичные как работает JUnit (с @Test и @ Before/@ После аннотаций).

0

Вы можете сделать это с помощью AOP (AspectJ или Spring или Spring + AspectJ). единственной проблемой, которая может быть проблемой, является параметр аннотации invokation="before", поскольку before, after, around и т. д. - это советы, которые жестко закодированы в ваших аспектах. AspectJ пример кода ниже:

public aspect CustomAnnotationAspect { 

    pointcut customAnnotationPointcut(Object t, CustomAnnotation annotationValue): execution(@CustomAnnotation * *.*(..)) && @this(annotationValue) && target(t); 

    before(Object target, CustomAnnotation annotationValue): customAnnotationPointcut(target, annotationValue) { 
     String className = annotationValue.className(); 
     String methodName = annotationValue.methodName(); 
     //do some reflection staff for className.methodName() invocation 
    } 

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