Java自定义注解的原理是通过编译器和Java反射机制+AOP实现的。在编译过程中,编译器会检查自定义注解的合法性,并将注解信息保存到编译后的字节码文件中。
首先需要明白的是注解是给程序看的,是一个给程序看的注释。@Autowired注解本身并没有相应的逻辑代码,当程序运行时会扫描哪些方法添加了该注解再做出相应的处理
自定义一个注解需要用到两个重要的元注解@Target和@Retention,@Tartget用于指定该注解要用于那个地方,用于指定注解的保留域。
Retention:
1.RetentionPolicy.SOURCE //源代码级别,编译器处理后不再保留
2.RetentionPolicy.CLASS //注解信息保留到类文件中
3.RetentionPolicy.RUNTIME //JVM读取,运行时使用
ElemenType:
1.ElemenType.TYPE //类、接口
2.ElemenType.FIEELD //成员变量
3.ElemenType.METHOD //成员方法
4.ElemenType.CONSTRUCTOR //构造器
5.ElemenType.PACKEGE / /包
6.ElemenType.ANNOTATION_TYPE //注解
在运行时,Java反射机制可以通过获取类、方法或字段上的注解信息,从而实现对注解的解析和使用。
1.定义一个名字叫annotationDemo的注解
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface annotationDemo {
}
2.在方法上使用该注解
@annotationDemo
public void test() {
System.out.println("hello world");
}
3.使用反射查看使用该注解的方法
@Test
public void myMethod() throws Exception{
Class clazz=Class.forName("com.jeem.app.config.annotationtest");
Method[] ms = clazz.getMethods();
for (Method m : ms) {
if(m.isAnnotationPresent(annotationDemo.class)){
System.out.println(m.getName());
}
}
}
运行结果
test
Process finished with exit code 0