zoukankan      html  css  js  c++  java
  • Annotation注解

    摘要: java 1.5开始引入了注解和反射,正确的来说注解是反射的一部分,没有反射,注解无法正常使用,但离开注解,反射依旧可以使用,因此来说,反射的定义应该包含注解才合理一些。

    定义一个注解类

    定义一个UserAnnotation注解类

    @Target(value = { ElementType.FIELD })
    @Retention(RetentionPolicy.RUNTIME)
    public @interface UserAnnotation {
    	public int id() default 0;
    	public String name() default "";
    	public int age() default 18;
    	public String gender() default "M";
    }

    一般来说,源码状态运行和编译状态运行的注解往往和编译器相关,比如报错,警告,类编译参数等,这2类状态一般和编辑器插件关系密切,这里不再讨论

    在日常开发中RUNTIME用的最多,这是开发人员可以控制的一个状态。

    说明1:Target

    【@target】这个注解来指定给哪一类java成员注解,指定注解目标该是什么样的东西

    @Documented
    @Retention(RetentionPolicy.RUNTIME)
    @Target(ElementType.ANNOTATION_TYPE) //这不是在作弊,这确实是自己注解自己,所以说注解也可以被字节给注解
    public @interface Target {
        ElementType[] value(); //值可以使数组 value={...}
    }
    
    public enum ElementType {
        TYPE,  //给类(型)注解
        FIELD, //给字段注解,不要忘了,字段可以是对象
        METHOD, //给方法注解
        PARAMETER, //给参数注解
        CONSTRUCTOR, //给构造方法注解
        LOCAL_VARIABLE, //给局部变量注解
        ANNOTATION_TYPE,//给注解注解(这貌似把自己不当类来看)
        PACKAGE, //给包注解
        TYPE_PARAMETER, //不知道,等知道了我再写在这里
        TYPE_USE //这个也不知道
    }

    说明2:Retention

    @Retention】表示注解运行的状态,换句话说,注解改在什么样的状态下才能运行

    @Documented
    @Retention(RetentionPolicy.RUNTIME)
    @Target(ElementType.ANNOTATION_TYPE)
    public @interface Retention {
        RetentionPolicy value();
    }
    
    public enum RetentionPolicy {
        SOURCE, //源码状态运行,
        CLASS, //编译类文件时运行
        RUNTIME //运行时运行
    }

    使用注解类

    其实就是利用反射,看类或方法上是不是有该注解,然后进行相应处理。

    public class TestMain
    {
      @UserAnnotation(age=20,gender="F",id=2014,name="zhangsan")//注解的使用
      private Object obj;
      
      public static void main(String[] args) throws Exception
      {
         Filed objField = TestMain.class.getField("obj");
         UserAnnotation ua = objField.getAnnotation(UserAnnotation.class);//得到注解,起到了标记的作用
         
        System.out.println(ua.age()+","+ua.gender()+","+ua.id()+","+ua.name());
        //***进一步操作的话,假设Object要指向一个User类,那么可以讲注解的值给他
        TestMain tm = new TestMain();
        objFiled.set(tm,new User(ua.age(),ua.gender(),ua.id(),ua.name())); //不错吧,将自己的信息送给obj,起到了附加信息的作用
        
        //-----------请自由遐想吧~~,下面来说说注解怎么能获得注解自己的注解-------------
       Target t = ua.annotationType().getAnnotation(Target.class)
       ElementType[] values = t.value();
       //~~~~~~~~~~~~~~完了,再一次自由遐想吧~~~~~~~~~~~~~~
       
       Sysout.out.println("注意:是遐想,不是瞎想!!");
      }
    }

    总结

    注解自java 1.5引入以来,就被不断应用,目前各大框架基本都支持并开发了自己的注解,它的实用性让它使用广泛,因此掌握它很有必要。

    参考资料

  • 相关阅读:
    rk3288的SDK修复cm3218光敏驱动bug
    UVA 12627
    用JDBC编程的执行时错误及其解决大全
    linux中文输入法
    树套树专题——bzoj 3110: [Zjoi2013] K大数查询 & 3236 [Ahoi2013] 作业 题解
    To Noob Json是什么鬼?
    2015.7.3, 杭州……产品级敏捷案例研究
    Java下拼接运行动态SQL语句
    spring mvc+ajax分页
    Linux开发环境搭建与使用——ubuntu更新设置
  • 原文地址:https://www.cnblogs.com/huntdream/p/6014642.html
Copyright © 2011-2022 走看看