Das Ziel ist es 3 Annoations zu schreiben, die je nachdem vor oder nach einen Methodenaufruf eine andere Methode aufruft. Mein Problem ist nur, dass ich zwar mit Annotations arbeite ( Spring Boot, JPA, Lombok, ... ) aber noch nie eigene geschrieben habe. Bin da nicht so sehr spezalisiert in Java.
Deswegen bitte ich einen erfahreneren Programmierer mir mal ein Beispiel Prozessor zu schreiben wie das funktionieren könnte. Dürfte ja kein großer Aufwand sein.
Anforderung: Das Method-Calling sollte/ braucht eigentlich nur innerhalb einer Klassenstruktur(mit Vererbung) funktionieren und mit einer id.
Wieso das ganze? Ich weiß, man kann auch einfach die Methode in der Methode aufrufen, aber da ich mit Lombok arbeite (@Getter, @Setter) und bei jeder Setter-Methode die andere Methode aufgerufen werden soll.
Deswegen bitte ich einen erfahreneren Programmierer mir mal ein Beispiel Prozessor zu schreiben wie das funktionieren könnte. Dürfte ja kein großer Aufwand sein.
Anforderung: Das Method-Calling sollte/ braucht eigentlich nur innerhalb einer Klassenstruktur(mit Vererbung) funktionieren und mit einer id.
Wieso das ganze? Ich weiß, man kann auch einfach die Methode in der Methode aufrufen, aber da ich mit Lombok arbeite (@Getter, @Setter) und bei jeder Setter-Methode die andere Methode aufgerufen werden soll.
Java:
public class Example{
private Object object;
....
@PostMethod("method-id")
public void setObject(Object object){
...
}
//Es dürfen keine Parameter verwendet werden.
@CallMethod("method-id")
private void save(){
...
}
Java:
@Setter(onMethod={@PostMethod})
public class Example{
private Object object;
....
//Es dürfen keine Parameter verwendet werden.
@CallMethod("method-id")
private void save(){
...
}
Java:
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.SOURCE)
public @interface PreMethod {
String method();
}
Java:
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.SOURCE)
public @interface PostMethod {
String method();
}
Java:
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.SOURCE)
public @interface CallMethod {
String method();
}
Java:
//Quelle: http://icancode.de/3448/eigene-java-annotations-teil-1 abgewandelt
@SupportedAnnotationTypes({"CallMethod", "PostMethod", "PreMethod"})
public class CallMathodProcessor extends AbstractProcessor {
// utils
Types types;
Elements elems;
@Override
public boolean process(Set<? extends TypeElement> set, RoundEnvironment roundEnvironment) {
return false;
}
private void processAnnotation(Element method, Messager msg) {
final CallMethod ann = method.getAnnotation(CallMethod.class);
// check basic properties
if (method.getKind() != ElementKind.METHOD) {
error("annotation only for methods", method);
}
// check types
final ExecutableType emeth = (ExecutableType) method.asType();
if (not(emeth.getReturnType().getKind().equals(TypeKind.BOOLEAN))) {
error("annotated Element must have return type boolean", method);
}
if (emeth.getParameterTypes().size() != 1) {
error("annotated Element must have exactly one parameter", method);
} else {
final TypeMirror param0 = emeth.getParameterTypes().get(0);
final TypeMirror string = elems.getTypeElement(String.class.getCanonicalName()).asType();
final boolean isSame = types.isSameType(param0, string);
if (not(isSame)) {
error("annotated Element must have exactly one String parameter", method);
}
}
}
/** @param where will be used to present a position hint in the compiler message, if null its a position-less message */
void error(String msg, Element where) {
processingEnv.getMessager().printMessage(Diagnostic.Kind.ERROR, msg, where);
}
private static boolean not(boolean val) { return !val; }
}