注解并不是程序本身, 但是可以被其他程序/编译器读取. 注解类似一个说明, 这个说明可以被其他类读到.
这些注解本身放在这没有意义,需要有其他的程序来处理这些注解才有实际意义, 也就是需要反射来解析注解.
根据注解的提示, 提供什么样的反射.
比如, @Override 就是一个注解
元注解: 对注解做进一步解释
@Target, 描述注解的使用范围,@Target(value=ElementType.method) 这个注解是用来修饰方法的
@Retention, 注解保留策略, (source, class, runtime), 如果是source, 那么这个注解就只保留在源码级别, 而如果是class 会被加载到类了,如果是runtime,这个注解可以被编译器读取(反射).
反射, 解析注解通常由框架已经做好了,你所要做的就是定义注解和使用注解(把注解注册到对应位置).
可以运行时加载, 探知,使用编译期间完全未知的类.
程序已经跑起来了,在运行时,依然可以再加载一些你只知道相关名字的类.对于任意一个已加载的类, 都能够知道这个类的所有属性和方法,对于任意一个对象,都能够调用它的任意一个方法和属性;
String s = "com.abc.User"; Class c = Class.forName(s); 这样也是可以的 (这就是照镜子的过程)
Class c = Class.forName("com.abc.User"); 这个双引号中是一个类的名称, 这个值是可以改的,比如你改成Student,那么程序运行时,就动态的加载了Student 这个类. 加载之后, 这个类的对象就在堆内存中创建了这个对象。这个对象就像一面镜子一样,通过这面镜子可以看到对应类的全部信息,就可以动态的调用相关方法和属性了。
一个类只对应一个反射对象,多次调用 Class c2 = Class.forName(s); 实际上返回的都是同一个对象(因为这不是创建新的对象,而是调用对象)
还有获取方法:
Class strClazz = String.class;
Class strClazz = path.getClass(); 当然, 获取到的对象肯定是同一个对象.
有一些反射的 api 可以被调用, 比如 strClazz.getFileds() 返回属性 等等
1. 之前类模板都是由 JVM 运行的 class 文件产生的, 现在是在运行过程中, 谁需要, 谁来创建这个类模板.
2. 另外, 在运行中创建的对象(模子是外部给出的), 这个对象可以通过反射(类似照镜子的功能), 将这些对象里的信息拿出来使用, 比如这些对象里的方法.
所以, 反射相当于运行时, 根据运行的状态, 来传入不同的类的模板, 根据这个类的模板, 来动态反射出来这个模板的对象, 然后使用该对象的方法的过程.
我们知道反射是在动态运行时使用的, 那反射如何知道代码中哪些程序可以被反射调用呢? 哪些是 JVM 原生创建的呢? 这时就需要注解了
注解的意义就是给JVM 在运行时提示, 这部分内容是可以被"反射的".
而目前来看, 在 springBoot 里, 注解已经由大神写好了,我们只需要写注解, 就是在我们的应用中, 哪个部分用到哪些反射, 通过注解给出提示.
比如 Maven, 也是通过这种反射的机制来做的.(应该是)
原文:https://www.cnblogs.com/moveofgod/p/12490893.html