只在java中提供我的自定义注释,在任何方法执行之前和之后执行一些代码

时间:2016-11-05 04:35:57

标签: java annotations

我正在尝试编写自定义注释的代码。当我在任何方法上使用这个注释时,那么在执行之前和执行方法之后,应该执行一些简单的打印消息。我试过这样:

  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()方法之前和之后打印注释值。

请帮我解决这个问题。

1 个答案:

答案 0 :(得分:2)

有两种方法,它们都非常复杂,运行时和编译时解决方案:

  1. 运行时解决方案依赖于用于实例化应用程序的特定框架。常见的方法是为最终对象创建包装代理,并在调用原始对象方法之前(或之后)从代理执行这些操作。
  2. 对于spring,例如,解决方案是注册BeanPostProcessor对象,该对象将拦截bean的实例化并检查某些方法是否包含DemoAnnotation注释。如果是这样,它将创建该对象的代理并将代理作为真实bean返回。

    1. 第二个解决方案是编译时解决方案,它基于可以修改java编译器行为的注释处理器。您需要创建并注册注释处理器,并在解析源文件后检查方法上的注释并在编译期间添加相关代码。有许多助手,您可以在TreeScanner.visitMethod()方法上注册并从注释处理器调用TreeScanner。
    2. 一般来说,好的例子可以在lombok中找到,它在编译时修改代码方面做了类似的事情。