23、注解

------- <a href="http://www.itheima.com" target="blank">android培训</a>、<a href="http://www.itheima.com" target="blank">java培训</a>、期待与您交流! ----------


1、 注解(Annotation)
从 JDK 5.0 开始, Java 增加了对元数据(MetaData)的支持, 也就是Annotation(注解)。
什么是Annotation,以及注解的作用?三个基本的 Annotation:
   Annotation其实就是代码里的特殊标记, 它用于替代配置文件,也就是说,传统方式通过配置文件告诉类如何运行,有了注解技术后,开发人员可以通过注解告诉类如何运行。在Java技术里注解的典型应用是:可以通过反射技术去得到类里面的注解,以决定怎么去运行类。注解相当于一种标记,在程序中加了注解就等于为程序打上了某种标记,没加,则等于没有某种标记,以后,javac编译器,开发工具和其他程序可以用反射来了解你的类及各种元素上有无何种标记,看你有什么标记,就去干相应的事。标记可以加在包,类,字段,方法,方法的参数以及局部变量上。
(1)  @Deprecated 注释的程序元素,不鼓励程序员使用这样的元素,通常是因为它很危险或存在更好的选择。
(2)  @deprecation 过时的方法
(3)  @override 覆盖父类的方法
(4)  @SuppressWarnings指示应该在注释元素(以及包含在该注释元素中的所有程序元素)中取消显示指定的编译器警告。注意,在给定元素中取消显示的警告集是所有包含元素中取消显示的警告的超集
(5)@Retention: 只能用于修饰一个Annotation 定义, 用于指定该Annotation 可以保留的域, 也就是指示注释类型的注释要保留多久
      @Rentention 包含一个RetentionPolicy 类型的成员变量, 通过这个变量指定域。
       RetentionPolicy.CLASS: 编译器将把注解记录在 class 文件中. 当运行 Java 程序时, JVM 不会保留注解. 这是默认值
       RetentionPolicy.RUNTIME:编译器将把注释记录在 class 文件中. 当运行 Java 程序时, JVM 会保留注解. 程序可以通过反射获取该注释
       RetentionPolicy.SOURCE:编译器直接丢弃这种策略的注释Retention(值)元注解,
       其三种取值:RetetionPolicy.SOURCE/ RetetionPolicy.CLASS、RetetionPolicy.RUNTIME;分别对应:java源文件-->class文件-->内存中的字节码。
         @Override: 限定重写父类方法, 该注解只能用于方法 RetetionPolicy.SOURCE
         @Deprecated: 用于表示某个程序元素(类, 方法等)已过时 RetetionPolicy.RUNTIME
         @SuppressWarnings:抑制编译器警告. RetetionPolicy.SOURCE
     当一个 Annotation 类型被定义为运行时 Annotation后, 该注释才是运行时可见, 当class 文件被载入时保存在class 文件中的Annotation 才会被虚拟机读取.程序可以调用AnnotationElement 对象的如下方法来访问 Annotation信息
         
(6)@Target 指示注释类型所适用的程序元素的种类 方法或者类或者字段()@Target 包含了一个名为value,类型为ElementType(JDK6)的成员变量。
   ANNOTATION_TYPE注释类型声明
   CONSTRUCTOR 构造方法声明
   FIELD 字段声明(包括枚举常量)
   LOCAL_VARIABLE 局部变量声明
   METHOD 方法声明
   PACKAGE 包声明
   PARAMETER 参数声明
   TYPE 类、接口(包括注释类型)或枚举声明
(7)@Documented: 用于指定被该元Annotation 修饰的Annotation 类将被javadoc 工具提取成文档。
(8)@Inherited: 被它修饰的Annotation 将具有继承性.如果某个类使用了被@Inherited 修饰的Annotation, 则其子类将自动具有该注解。


  Class的父类是Type
加一个注解就相当于在程序中调用了一个类
用注解对一个类进行检查isAnnotationPresent
定义一个注解


@interface A{
}
应用了注解的类
@A
class b{
}
对应用了注解类的类进行反射操作的类
if(AnnontationTest.class.isAnnotationPresent(Dre amAnnotation.class)){
   DreamAnnotation da= AnnontationTest.class.getAnnotation(DreamAnnotation.class);
   System.out.println(da);
  }


自定义注解及其应用
定义一个最简单的注解:public @interface MyAnnotation {}
把它加在某个类上:
    @MyAnnotation
    public class AnnotationTest{}

为注解增加基本属性
定义基本类型的属性和应用属性:
在注解类中增加String color();
@MyAnnotation(color="red")
用反射方式获得注解对应的实例对象后,再通过该对象调用属性对应的方法
MyAnnotation a = (MyAnnotation)AnnotationTest.class.getAnnotation(MyAnnotation.class);
System.out.println(a.color());
可以认为上面这个@MyAnnotation是MyAnnotaion类的一个实例对象
为属性指定缺省值:
String color() default "yellow";
value属性:
String value() default "zxx";
如果注解中有一个名称为value的属性,且你只想设置value属性(即其他属性都采用默认值或者你只有一个value属性),那么可以省略value=部分,例如:@MyAnnotation("lhm")。
 
数组类型的属性
int [] arrayAttr() default {1,2,3};
@MyAnnotation(arrayAttr={2,3,4})
如果数组属性中只有一个元素,这时候属性值部分可以省略大括
枚举类型的属性
EnumTest.TrafficLamplamp() ;
@MyAnnotation(lamp=EnumTest.TrafficLamp.GREEN)
注解类型的属性:
MetaAnnotationannotationAttr() default @MetaAnnotation("xxxx");
@MyAnnotation(annotationAttr=@MetaAnnotation(“yyy”))
可以认为上面这个@MyAnnotation是MyAnnotaion类的一个实例对象,同样的道理,可以认为上面这个@MetaAnnotation是MetaAnnotation类的一个实例对象,调用代码如下:
     MetaAnnotation ma = myAnnotation.annotationAttr();
     System.out.println(ma.value());

    应用代码示例:
1、 定义一个注解作为另一个注解的元注解
  public @interface MetaAnnotation {
 String value();
}
2、 定义一个注解,作为类的注解

import java.lang.annotation.*;
@Retention(RetentionPolicy.RUNTIME)
public @interface MyAnnotation {
 /*不用加修饰符,默认为public abstract
      用该方法指定属性,并为属性指定默认值
      如果只有一个属性需要赋值,可以不写属性名
  */
 String color() default "blue"; String value();
 //数组类型的属性
 int[] attr() default {3,4,5};
 //枚举类型的属性
 TrafficLamp lamp() default TrafficLamp.RED;
 //注解类型的属性
 MetaAnnotation metaAnnotation() default @MetaAnnotation("zyg");
}
 
3、 应用注解

@MyAnnotation(metaAnnotation = @MetaAnnotation("zyg"),value = "abc",attr = {7,8,9})
public class AnnotationTest {
 public static void main(String[] args) {
  //返回false,因为注解的生命周期默认值是RetetionPolicy.CLASS阶段
  System.out.println(AnnotationTest.class.isAnnotationPresent(MyAnnotation.class));
  MyAnnotation annotation = (MyAnnotation)AnnotationTest.class.getAnnotation(MyAnnotation.class);
  System.out.println(annotation.color());
  System.out.println(annotation.metaAnnotation().value());
 
 }
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值