java - 仅通过在 java 中提供我的自定义注释来在任何方法执行之前和之后执行一些代码

标签 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. 运行时解决方案依赖于用于实例化应用程序的特定框架。常见的方法是为最终对象创建包装代理,并在调用原始对象方法之前(或之后)从代理中执行操作。

例如,对于 spring,解决方案是注册 BeanPostProcessor对象,它将拦截 bean 的实例化并检查某些方法是否包含 DemoAnnotation 注释。如果确实如此,它将创建该对象的代理并将该代理作为真实的 bean 返回。

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

    关于java - 仅通过在 java 中提供我的自定义注释来在任何方法执行之前和之后执行一些代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40434802/

    相关文章:

    java 日期值显示不正确

    java - 如何让 JButton 进入与图像相同的窗口?

    java - 增加锁数量的最佳方法是什么?

    asp.net-mvc - 在 Controller 级别应用时如何禁用操作属性?

    java - @RequestMapping 在渲染方法中带有 2 个参数

    java - IntelliJ IDEA : how to ignore "@see comments" javadoc in method hierarchy?

    java - JTable 未从 SwingWorker 线程更新

    iphone - 如何在同一位置放置多个图钉

    java - Guice @为单例提供两次依赖实例

    iOS - 多个 GMSMarker 问题