我正在尝试编写自定义注释的代码。当我在任何方法上使用这个注释时,那么在执行之前和执行方法之后,应该执行一些简单的打印消息。我试过这样:
import java.lang.annotation.*;
@Retention(RetentionPolicy.RUNTIME)
@interface DemoAnnotation {
String value();
String value1();
}
// Applying annotation
class CustomAnnotationExample {
@DemoAnnotation(value = "code is started!!!", value1= "code is completed!!!")
public void sayHello() {
System.out.println("hello Annotation Example");
}
}
并在另一个主要方法中称之为:
CustomAnnotationExample h=new CustomAnnotationExample();
Method m=h.getClass().getMethod("sayHello");
DemoAnnotation anno=m.getAnnotation(DemoAnnotation.class);
System.out.println(anno.value());
h.sayHello();
System.out.println(anno.value1());
我想在不使用main方法中的System.out.println()的情况下打印注释中的值。当我只是调用sayHello()方法时。应在执行sayHello()方法之前和之后打印注释值。
请帮我解决这个问题。
答案 0 :(得分:2)
有两种方法,它们都非常复杂,运行时和编译时解决方案:
对于spring,例如,解决方案是注册BeanPostProcessor
对象,该对象将拦截bean的实例化并检查某些方法是否包含DemoAnnotation注释。如果是这样,它将创建该对象的代理并将代理作为真实bean返回。
TreeScanner.visitMethod()
方法上注册并从注释处理器调用TreeScanner。一般来说,好的例子可以在lombok
中找到,它在编译时修改代码方面做了类似的事情。