Annotation(注解)

Java5开始 Java支持对元数据的支持, 就是是Annotation(注解)
元数据: metadata描述数据的数据
注解:标签 Annotation
所有的Annotation都是java.Lang.annotation.Annotation接口的子接口
所有Annotation是一种特殊的接口

既可以放在方法上,放在变量上,放在类或接口上
使用注解需要注意:必须有三个参与才有意义
1.有注解的本身
2.被放置的位置(类,属性,方法,接口,参数上,包等等)
3.由第三方程序使用反射的手段赋予注解特殊的功能

Java5之前自带注解
Java5中提供的

@Override –> 限定子类重写父类的方法,只能在方法上
@Deprecated –> 标记当前方法已经过时,不推荐使用 只能用在方法上
@SuppressWarings –> 抑制编译器发出多种警告
@SuppressWarings(value=”all”) 可以应用在方法,类,属性上
Java7中提供了一个
@SafeVarargs 抑制堆污染
当方法使用可变参数和泛型参数,此时就会造成堆污染 Arrays.asList
Java8中提供一个
@FunctionalInteFace 函数式编程 –>所用在接口上

元注解:
描述注解的注解,用来限定注解可以贴在哪些程序元素上,还可以指定注解存在的周期
@Retention: 表示注解可以保存在哪一个代码时期. 保存的时期的值,封装在RetentionPolicy枚举类中:
注意:一般的,自定义的注解,使用RUNTIME.(使用反射赋予注解功能)
SOUECE:注解只能存在于源文件中,一旦编译,在字节码中就消失了.
CLASS:(缺省),注解可以存在于源文件和字节码文件中,一旦加载进JVM,在JVM中就消失了.
RUNTIME:注解可以存在于源文件,字节码文件,JVM中.

@Target:表示注解可以贴在哪些位置(类,方法上,构造器上等等).
位置的常量封装在ElementType枚举类中:
ElementType.ANNOTATION_TYPE只能修饰Annotation
ElementType.CONSTRUCTOR只能修饰构造方法
ElementType.FIELD只能修饰字段(属性),包括枚举常量
ElementType.LOCAL_VARIABLE只能修饰局部变量
ElementType.METHOD只能修饰方法
ElementType.PACKAGE只能修饰包(极少使用)
ElementType.PARAMETER只能修饰参数
ElementType.TYPE只能修饰类,接口,枚举


实现自己的注解:
语法格式:

栗子:

public @interface 注解名{
   注解中的成员:
   抽象方法 -->(属性)
   数据类型 方法名()  default 默认值;
}

ps:Spring框架中–> 注解最多 –> 动态代理模式 –> 内省模式JavaBean和Map互转


栗子:
自定义注解:

@Retention(RetentionPolicy.RUNTIME)  //注解的声明周期就是源文件 ,编译文件和 JVM中
@Target(ElementType.TYPE) //注解可以书写的位置 类,方法和接口
public @interface VIP{
//抽象方法
//可以在注解中声明的数据类型:基本数据类型,String,Class ,数组,枚举,Annotation
//声明的同时就赋值,此时在外部写书注解时就不需要赋值
String Value();
int age() defaul 19;
String[] favs();

}
//若自定注解在注解中声明抽象方法(属性),使用注解时就需要给当前注解中的抽象方法(属性)赋值
//若注解中使用了默认值,可以修改也可以不修改
@VIP(Value="A",age=19,favs = {"你好","呵呵"})
public class Student{
private String  name;
private int age;
}
public class VIPDemo {

    public static void main(String[] args) {
        //1.获取Student上的所有注解(反射)
        Annotation[] as  =   Student.class.getAnnotations();
        for(int i = 0;i<as.length;i++) {
            System.out.println(as[i]);
        }
        //2.获取Student真正的注解
        //判断当前类是否存在指定注解
        if(Student.class.isAnnotationPresent(VIP.class)) {
             //获取注解对象
            VIP vip =  Student.class.getAnnotation(VIP.class);
            String str = vip.Value();
            String[] strs  = vip.favs();
            System.out.println(str);
            System.out.println(Arrays.toString(strs));



        }

    }

}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值