注解和自定义注解

1.什么是注解
注解是JDK1.5的新特性,它是一种标记,可以标记类,方法,成员变量,局部变量,参数等....
这个标记主要是给编译器看的,或者给JVM看的   
2.注解的三个作用
a.生成帮助文档:
    @author 作者信息
    @verson 版本信息
b.编译检查:
    @Override 检查方法重写是否正确
c.给框架的作为配置使用        
    (Mybatis,Spring,SpringMVC)这些框架都会用到注解    
3.常见的注解介绍
@Override 方法重写注解
@FunctionalInterface 函数式接口注解
@Deprecated 过期注解 
@author 用来标识作者
@version 用于标识版本
@Test junit单元测试
4.自定义注解
public @interface 注解名{}
5.给自定义注解添加属性
格式:
    public @interface 注解名{
        //注解中只能写属性
        数据类型 属性名() [default 默认值];
    }
注解中属性的数据类型必须是以下三大类之一:
a.8种基本类型(byte,short,int,long,char,float,double,boolean)
b.4种引用类型(String,枚举类型,Class类型,其他注解类型)
c.以上12种的一维数组

  注意事项:
  a.默认情况下,我们的注解可以标记在类上,方法上,成员变量上,参数上,局部变量上等...
  b.使用注解进行标记时,必须保证该注解的某个属性都有值
  即没有默认值的属性必须赋值,有默认值的属性可以赋值也可以不赋值

/**
 * 自定义注解
 */
public @interface MyAnnotation {
    //给注解添加属性
    int age();// default 10;
    String name();// default "张三";
    String[] hobby();// default {"抽烟","喝酒","烫头"};
}
6.自定义注解中的特殊属性名value
a.如果注解中只有一个属性且名字叫value,则在使用该注解时可以直接给该属性赋值,而不需要 给出属性名。
/**
 * 特殊属性名value
 */
public @interface MyAnno {
    String value();
}
@MyAnno("jack") //省略"value="直接写属性值
public class Demo {
}

b.如果注解中除了value之外,其他的属性都有默认值,并且使用时只给value赋值,那么直接给该属性赋值,而不需要 给出属性名。
/**
 * 特殊属性名value
 */
public @interface MyAnno {
    String value();
    int age() default 10;
    String name() default "rose";
}
@MyAnno("jack") //省略"value="直接写属性值
public class Demo {
}  
7.注解的注解--元注解
两个元注解:
    a.@Target元注解
        作用: 规定我们的注解的标记目标
        属性名: value
        属性值:
            在ElementType枚举类中的如下值:
                TYPE,类,接口 
                FIELD, 成员变量 
                METHOD, 成员方法 
                PARAMETER, 方法参数 
                CONSTRUCTOR, 构造方法 
                LOCAL_VARIABLE, 局部变量
       /**
         * 自定义注解
         */
        //@Target(ElementType.TYPE)
        //@Target(ElementType.FIELD)
        //@Target(ElementType.METHOD)
        //@Target(ElementType.CONSTRUCTOR)
        //@Target(ElementType.PARAMETER)
        @Target(ElementType.LOCAL_VARIABLE)
        public @interface MyAnnotation {
        }  

b.@Retension元注解
        作用:规定我们的注解的生命周期
        属性名:value
        属性值: 
            必须是RetensionPolicy枚举类中的成员,其值如下:
            SOURCE: 代表我们的注解只在源码阶段存在
            CLASS: 代表我们的注解在源码中存在,编译之后也存在,但是加载到JVM中会删除
            RUNTIME:代表我们的注解 在源码中存在,编译之后也存在,加载到JVM后还是存在(一直存在)    

        @Rentension(RetensionPolicy.SOURCE)
        public @interface MyAnnotation {
        } 

 8.案例 遍历test.class,找出其中有MyTest注解的方法,并执行

Class<Test> testClass = Test.class;
Method[] methods = testClass.getDeclaredMethods();
for (Method m : methods) {
   if (m.isAnnotationPresent(MyTest.class)) {
     m.invoke(testClass.newInstance());
   }
}

 

posted @ 2020-07-04 18:15  一半人生  阅读(359)  评论(0编辑  收藏  举报