用框架,天天和注解打交道,只知道加某个注解就实现了某个功能,但是注解是如何运转的也不知道,毕竟自定义注解很少用或没用过,学过注解的也只是知道它是通过反射来实现的,但是!但是!但是!看下面>>>>>>>>>>
- 当我们在IDEA中点某个注解进去的时候发现,啥都没有,就那么点点代码,想想应该有个代码逻辑实现的过程才对呀
- 我不信,继续点,点…点着点着到元注解了,反正就是看不到代码实现过程,就算是反射机制,那这个注解也是应该和哪个实现类挂钩呀,为什么找不到呢
- 哦上网找了资料,先看看一个自定义注解的实现过程:
//自定义一个注解
@Retention(RetentionPolicy.RUNTIME)
public @interface MyJunit {
}
public class PrintNumber {
public void showOdd(){ //打印奇数
for (int i = 0; i < 10; i++) {
if (i % 2!=0) {
System.out.print(i+" ");
}
}
}
@MyJunit
public void showEven(){ //打印偶数
for (int i = 0; i < 10; i++) {
if (i % 2==0) {
System.out.print(i+" ");
}
}
}
}
public class JunitTest {
public static void main(String[] args) throws Exception {
//1.创建PrintNumber对象
PrintNumber printNumber = new PrintNumber();
//2.获取该类的字节码文件对象
Class<? extends PrintNumber> clazz = printNumber.getClass();
//3.获取对象中的所有方法
Method[] methods = clazz.getMethods();
for (Method method:methods) {
//4.判断方法上是否有@MyJunit注解
boolean flag = method.isAnnotationPresent(MyJunit.class);
//5.如果方法上有@MyJunit注解,则执行
if (flag){
method.invoke(printNumber);
}
}
}
}
到这里终于明白了,注解确实不包含任何业务逻辑。
它利用反射机制在类加载的时候判断哪个方法或者类上使用了该注解,然后就调用相应的逻辑代码,也就是实现类进行功能的实现,所以我们才在注解中看不到任何的代码逻辑实现过程,这些代码逻辑实现过程应该是在另一个地方,我想应该是和注解在同一个包下,想要看实现过程需要自己去找,因为是通过反射机制的,所以在类加载的时候,JVM通过判断自己会去寻找这个实现类。