2016-09-22 1 views
1

Ich versuche, eine benutzerdefinierte Anmerkung zu implementieren, die wie etwas aussieht aufzurufen:Java benutzerdefinierte Anmerkung eine andere Methode vor dem Aufruf der kommentierten Methode

public class Foo{ 

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

Das Verfahren in der Anmerkung angegeben aufgerufen werden sollte, bevor die eigentliche Methode ist aufgerufen. Bitte schlagen Sie vor, wie Sie dies erreichen können.

+0

IMO, was Sie hier tun, nicht viel Sinn machen. Sie versuchen Dinge neu zu implementieren, die Sie viel einfacher über AOP erledigen können. Aber wenn Sie AOP verwenden, warum sollten Sie dann Ihren Hauptanwendungscode mit Informationen darüber, wie Sie bereichsübergreifende Probleme anwenden, verseuchen? Eine saubere Lösung wäre, diese Information vollständig in die Aspekte selbst zu externalisieren und die Reflektionsmagie loszuwerden. Lass es mich wissen, wenn du ein einfaches AspectJ-Beispiel von dem sehen willst, worüber ich spreche. – kriegaex

Antwort

1

Was möchten Sie hier erreichen? Warum würdest du die Methode nicht einfach im Methodenkörper aufrufen?

Anmerkungen werden während der Kompilierung verarbeitet und stehen zur Laufzeit zur Verfügung (wenn ihre Lebensdauer auf Runtime festgelegt ist). Sie können verwendet werden, um Code zur Kompilierungszeit zu generieren oder um zu beeinflussen, wie anderer Code Ihre Klasse behandelt. Sie können jedoch keine vorhandenen Klassen während der Annotationsverarbeitung ändern.

Das einzige, was Sie dafür tun können, ist, wenn Sie diese Methode nur von einem einzigen Ort aus aufrufen, können Sie reflection verwenden, um nach dieser Annotation zu suchen, und die Methode aufrufen (wiederum mithilfe von reflection, um die Methode aufzurufen) wie JUnit funktioniert (mit @Test und @ Before/@ Nach Anmerkungen).

0

Sie können dies mit AOP (AspectJ oder Spring oder Spring + AspectJ) tun. Die einzige Sache, die ein Problem sein kann, ist der invokation="before" Annotationsparameter, weil before, after, around usw. Ratschläge sind, die in Ihren Aspekten hartcodierten. AspectJ Codebeispiel unten:

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 
    } 

} 
Verwandte Themen