annotation 的方法

@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。注解元素可用的类型如下所示:

  • 所有基本类型(int,float,boolean等)
  • String
  • Class
  • enum
  • Annotation
  • 以上类型的数组

如果使用其他类型,编译器会报错。

 

在我们的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

猜你喜欢

转载自blog.csdn.net/xiamaocheng/article/details/88977239
今日推荐