我正在尝试编写自定义注释的代码。当我在任何方法上使用此注释时,在方法执行之前和执行之后应该执行一些简单的打印消息。我尝试过这样的:
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() 方法之前和之后打印。
请帮我解决这个问题。
最佳答案
有两种方法,都非常复杂,运行时和编译时解决方案:
- 运行时解决方案依赖于用于实例化应用程序的特定框架。常见的方法是为最终对象创建包装代理,并在调用原始对象方法之前(或之后)从代理中执行操作。
例如,对于 spring,解决方案是注册 BeanPostProcessor
对象,它将拦截 bean 的实例化并检查某些方法是否包含 DemoAnnotation 注释。如果确实如此,它将创建该对象的代理并将该代理作为真实的 bean 返回。
- 第二个解决方案是编译时解决方案,基于注释处理器,可以修改 java 编译器行为。您需要创建并注册注释处理器,并在解析源文件后检查方法上的注释并在编译时添加相关代码。有很多帮助者,您可以例如注册
TreeScanner.visitMethod()
方法并从注释处理器调用 TreeScanner。
一般来说,很好的例子可以在 lombok
中找到。它在编译时修改代码方面做了类似的事情。
关于java - 仅通过在 java 中提供我的自定义注释来在任何方法执行之前和之后执行一些代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40434802/