In base alle risposte dei miei commenti, non sarà possibile farlo con solo annotazioni. Puoi, ovviamente, creare le tue annotazioni e creare del codice riflettente che verrà rilevato e poi eseguire un codice, ma questo non cambierà troppo il tuo codice, perché dovrai chiamare il metodo parser
prima di chiamare i tuoi metodi e credo questo non ti aiuterà troppo, dal momento che dovrai chiamare il metodo parser prima di ogni chiamata.
Se hai bisogno del comportamento che hai citato (chiamata automatica), dovrai combinare le tue annotazioni con qualche framework AOP come Spring (plain Java) o AspectJ (AspectJ code). Con quindi, è possibile impostare i collegamenti e ogni volta che viene raggiunto questo punto, può essere eseguito del codice. È possibile configurare quindi per eseguire alcuni codice prima e/o dopo l'esecuzione del metodo.
Se il primo scenario è sufficiente, si può fare qualcosa di simile:
Logger: enum
public enum Logger {
INFO,
DEBUG;
}
LogMethodCall della nota:
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Retention(RetentionPolicy.RUNTIME) // the annotation will be available during runtime
@Target(ElementType.METHOD) // this can just used in methods
public @interface LogMethodCall {
Logger logLevel() default Logger.INFO;
}
Persona: classe annotata
public class Person {
// will use the default log level (INFO)
@LogMethodCall
public void foo(int a) {
System.out.println("foo! " + a);
}
@LogMethodCall(logLevel = Logger.DEBUG)
public void bar(int b) {
System.out.println("bar! " + b);
}
}
Utils: classe con il metodo statico log (questa si esibirà il "parsing")
public class Utils {
public static void log(Object o, String methodName) {
// gets the object class
Class klass = o.getClass();
// iterate over its methods
for (Method m : klass.getMethods()) {
// verify if the method is the wanted one
if (m.getName().equals(methodName)) {
// yes, it is
// so, iterate over its annotations
for (Annotation a : m.getAnnotations()) {
// verify if it is a LogMethodCall annotation
if (a instanceof LogMethodCall) {
// yes, it is
// so, cast it
LogMethodCall lmc = (LogMethodCall) a;
// verify the log level
switch (lmc.logLevel()) {
case INFO:
System.out.println("performing info log for \"" + m.getName() + "\" method");
break;
case DEBUG:
System.out.println("performing debug log for \"" + m.getName() + "\" method");
break;
}
}
}
// method encountered, so the loop can be break
break;
}
}
}
}
AnnotationProcessing: classe con il codice per verificare l'elaborazione di annotazione
public class AnnotationProcessing {
public static void main(String[] args) {
Person p = new Person();
Utils.log(p, "foo");
p.foo(2);
Utils.log(p, "bar");
p.bar(3);
}
}
Ovviamente, dovrai migliorare il mio codice per soddisfare le tue esigenze. È solo un punto di partenza.
informazioni sulle annotazioni:
più su AOP:
Vuoi eseguire il codice di debug prima del metodo? – davidbuzatto
In questo caso si. – SiB
Ok. Mi sono dimenticato di chiedere. E questa esecuzione "prima" deve essere eseguita prima di ogni chiamata di metodo? – davidbuzatto