总结:Java的annotation没有行为,只能有数据。让其实现某些行为必须有实例(代理对象),再用反射技术执行某些行为
https://www.zhihu.com/question/24401191
注解是什么,其实注解本质是一个接口interface
从反编译后的信息中可以看出,注解就是一个继承自`java.lang.annotation.Annotation`的接口
Annotation是被动的元数据,永远不会有主动行为。但凡Annotation起作用的场合都是有一个执行机制/调用者通过反射获得了这个元数据然后根据它采取行动
定义:注解(Annotation),也叫元数据。一种代码级别的说明。annotation是一种在类、类型、属性、参数、局部变量、方法、构造方法、包、annotation本身等上面的一个附属品
于是问题就变成:
·有一个接口
·有一组键值对,它里面的数组能支持前面那个接口的功能
怎样才能把这个接口和这个map结合起来呢?
注解是个接口,那么在运行期间获取的那些实例是什么?
(jdk8 195行)
public static Annotation annotationForMap(final Class<? extends Annotation> var0, final Map<String, Object> var1) {
return (Annotation)AccessController.doPrivileged(new PrivilegedAction() {
public Annotation run() {
return (Annotation)Proxy.newProxyInstance(var0.getClassLoader(), new Class[]{var0}, new AnnotationInvocationHandler(var0, var1));
}
});
}
这个AnnotationInvocationHandler是一个实现了InvocationHandler的类,所以很明显这个其实就是动态地理了。
嗯,注解本质是个接口,然后运行期间获取到的到底是什么,就是个接口的代理对象。
然后说 @xxx 就能自动运行某个方法之类的具体实现,其实这类东西都依赖于一个容器或者工厂的东西,具体请看怎样理解 java 注解和运用注解编程?
https://www.zhihu.com/question/47449512/answer/106034220
创建一个注解,用关键字@interface来声明,这是一个注解类.@Target来声明注解目标,
@Retention用来说明该注解类的生命周期.
至于我们看到添加了注解的属性或方法会执行某些行为,事实上是使用了代理对象,在生成代理对象时(构造是它的事件处理类中,跑了那些方法,这其中又用到了反射技术)