@annoataiond
java annoatin 的方法:
@interface用来声明Annotation,@Documented用来表示该Annotation是否会出现在javadoc中,
@Target用来指定Annotation的类型,@Retention用来指定Annotation的策略。
java 常用的Annotation:
@Deprecated -- @Deprecated 所标注内容,不再被建议使用。 @Override -- @Override 只能标注方法,表示该方法覆盖父类中的方法。 @Documented -- @Documented 所标注内容,可以出现在javadoc中。 @Inherited -- @Inherited只能被用来标注“Annotation类型”,它所标注的Annotation具有继承性。 @Retention -- @Retention只能被用来标注“Annotation类型”,而且它被用来指定Annotation的RetentionPolicy属性。 @Target -- @Target只能被用来标注“Annotation类型”,而且它被用来指定Annotation的ElementType属性。 @SuppressWarnings -- @SuppressWarnings 所标注内容产生的警告,编译器会对这些警告保持静默。
标签@UseCase由UseCase.java定义,其中包含int元素id,以及一个String元素description。注解元素可用的类型如下所示:
如果使用其他类型,编译器会报错。
在我们的I啊哦记得玩annotaion住的多的基础之的之后,annotaiton
如何的在系统中的被处理的执行?
首先,我们来看一下,annotaion 的retenionPolicy 支持的三种不同的类型,
sourceCode
写在源码中,在编译的视乎的,就会被抛弃掉。
class
写在源代码中,在编译的过程中,被保留在的class中的,具体I按照什么的格式的被保存到class 文件的内部,这里就
没有深究了。
在代码运行过程中,VM的(java virtual machine)就不再的使用annotaion 信息,这里尽在编译阶段中使用。
runtime
信息被写入class文件中,在系统的运行过程中,被VM提取的通过relfect API来读取的信息。
基于的上面的三种的策略,就会有相应的三种对应的解析方法:
sourceCode
主要的解析: 代码编辑一起的,从代码的中生成文档,读取java 源文件,特点是
annotiton 信息在源代码中的存在。
class
基于java 代码的编译的之后的字节码信息,直接都去的class中的信息,常用的
asm,javasit,cglib等。
runtime 的方法:
基于 java 提供的反射接口的,读取的允许在runtime 读取class 文件的.
我们把研究的重点凡在如何上述的这词儿特曲完成相应的动作,简化的开发效率。
Runtime的处理主要依赖于反射的接口,在总结吗中年需找的接口中的和输入的方法参数的n根据
根据的内容和数值,基于地代理模式的,动态生成的相应的代理类实力,然后得通过代理类的
调用相应的Invacationhandler,在invokcation Haner
完成的anontion的所要执行的动作,然后继续调用原来的方法,继续执行。
这里的 AnnotationListenerFor这个Annotation的实现机理为例 讲解如何完成自定义的Annotation解析过程。
这里示例是基于@ActionListenerFor动态给标注的方法,注册到按钮的事件监听器中。
1.@Target(ElementType.method)
//标注的运行阶段的
@Retension(RentenPolicy.RUNTIME)
public @Interface ActionListener{
String source(); //变量
}
2.使用的annitaion的BUttonFrame
public class ButtonFrame extends JFrame {
public ButtonFrame() {
///.....省略代码
///调用Annotation处理类,
ActionListenerInstaller.processAnnotations(this);
}
@ActionListenerFor(source = "yellowButton")
public void yellowBackground() {
panel.setBackground(Color.YELLOW);
}
}
public static void processAnnotations(Object obj) {
Class> cl = obj.getClass();
for (Method m : cl.getDeclaredMethods()) //遍历方法
{
ActionListenerFor a = m.getAnnotation(ActionListenerFor.class);//获取Annotation
if (a != null) //判断是否存在
{
//例如,这里会是yellowButton
Field f = cl.getDeclaredField(a.source());
f.setAccessible(true); //如果是私有,可以将私有变量,设置为可以访问.
addListener(f.get(obj), obj, m);
}
}
}
7.3 基于的Procssor 对源码的中的annotaion 进行处理
在Java6 中,集成了AbstractProcess/Process的接口的来方面的是一个
使用,一边的对代码中的进行的处理。
7.4 基于动态字节码动态修改的class
可以借助第三放的泪哭额来进行动态修改,class 文件中的动作,
可用的第三方的类库:asm,cglib,javaassit.
7.5 总结:
虽然的java 语言的层面上,支持annotation ,但是用户的在定义的Annotation
并实现在相应的处理的handler还是需要一定工作量,总体而言,还不是的非常的简便。
这里将核心步骤的总结一下,主要针对的runtime之间的Annotion解析器。
1. 定义Annotation
2.定义annotation 的处理类
3.创建invavationHandle 予以处理具体的逻辑
4.基于的Proxy.newProxyInstance()创建代理,并将
代理的实力的绑定到的Invalaction的实际例子上,
5.选择合适的调用的Annotaion 的时机的切入点
说明:上述的代码实力的是参考的CoreJava Volume .
https://blog.csdn.net/blueheart20/article/details/18810693
参考资料:
https://www.cnblogs.com/skywang12345/p/3344137.html:
https://www.cnblogs.com/xiaomoxian/p/5199601.html