Java基础加强---Annotation(注解)

 


                  -------android培训java培训、期待与您交流! ----------

1.Annotation的概念


       Annotation(注解,也称之为注释),是一种从JDK5开始,Java增加额对元数据(MeteData)的支持。注解,其实是代码里的一种特殊标记。通过使用注解,程序开发人员可以在不改变原有逻辑的情况下,在源文件中嵌入一些补充的信息。代码分析工具、开发工具和部署工具通过这些补充信息进行验证或部署。注解可以标记加在包、类、构造器、方法、成员变量、参数、局部变量、代码块等的声明,这些信息被存储在注解的“name=value”对中。Annotation是一个接口,可以通过反射来获取指定程序元素的Annotation对象,然后通过Annotation对象来取得注解里的元素。


2.基本Annotation 


     Java中java.lang包有4种基本的Annotation:

(1)@Override  用来指定方法覆盖的,可以强制一个子类必须覆盖父类的方法;        

(2)@Deprecated  用于表示某个程序元素(类、方法等)已过时,当其他程序使用已过时的类、方法时,编译器或给出警告 ;

(3)@SuppressWarnings  指示被该Annotation修饰的程序元素(及里面的子元素)取消显示指定的编译警告;   

(4)@SafeVarargs    这是Java 7新增的基本注解,用于抑制“堆污染”警告(不作详细说明了)。

     

3.Meta Annotation(元注解)

java.lang.annotation包中有4个Meta Annotation(元注解),用于修饰其他的Annotation。

(1)@Retention   用于指定被修饰的Annotation可以保留多长时间(即注解的生命周期),包含一个RetentionPolicy类型的value成员变量,使用时必须为该value指定值。

     value成员变量只能是下面3个:

     1)RetentionPolicy.CLASS:编译器将把Annotation记录在class文件中,当运行Java程序时,JVM不再保留Annotation。这是默认值。

     2)RetentionPolicy.RUNTIME:编译器将把Annotation记录在class文件中,当运行Java程序时,JVM也会保留Annotation,程序可以通过反射获取该Annotation信息。

     3)RetentionPolicy.SOURCE:Annotation只保留在源代码中,编译器直接丢弃这种Annotation。

(2)@Target     用于指定被修饰的Annotation能用于哪些程序单元,里面也有一个value成员变量,主要有ElementType.TYPE(指定可以修饰类、接口、枚举

     等)、   ElementType.METHOD(指定只能修饰方法定义)等等,其余可以在API中ElementType枚举中查到。

(3)@Docmented  用于指定被修饰的Annotation类将被javadoc工具提取成API文档

(4)@Inherited     用于指定被修饰的Annotation将具有继承性,即被@Inherited修饰的注解所修饰的类的子类也会被@Inherited修饰。

 

4.Annotation的属性

注解内的属性(即value值)类型有:8个基本类型、String类、Class类型、枚举、注解、以及前面所有类型的数组。

 下面是自定义的一个注解

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

import Enum.EnumTest1; //自定义的枚举所在的包

@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.METHOD,ElementType.TYPE})
public @interface MyAnnotation1 {
 String color();//属性为字符串
 int[] arr();//属性为int数组
 String[] str();//属性为字符串数组
EnumTest1.TrafficLamp lamp() default EnumTest1.TrafficLamp.YELLOW ; //属性为一个自定义对的枚举
Class<?> c() default int.class;//属性为Class类
}

5.使用Annotation

下面是用来测试Annotation的程序

import Enum.EnumTest1;

@MyAnnotation1(color="yellow",arr={1,2,3,4},str="a",lamp=EnumTest1.TrafficLamp.RED,c=double.class)//数组只有1个元素,可以省略{}
public class AnnotationTest {
 public static void main(String[] args) {

     getV();//该方法已被注解为过时方法
    
    if(AnnotationTest.class.isAnnotationPresent(MyAnnotation1.class)){  //用isAnnotationPresent(Class<? extends Annotation>)判断该程序元素上是否存在指定类型的注解
      MyAnnotation1 a = AnnotationTest.class.getAnnotation(MyAnnotation1.class);//用getAnnotation(Class<T>)方法返回该程序元素上存在指定类型的注解
     System.out.println(a);//获取注解
     System.out.println(a.color());//获取注解的属性
     System.out.println(a.arr().length);
     System.out.println(a.str().length);
     System.out.println(a.lamp().nextLamp());
     System.out.println(a.c().getName());
    }
  
 }
 
 @Deprecated//过时注解
 public static void getV(){
  
 }
 
 @Override //重写注解
 public boolean equals(Object obj){
  return false;  
 }

}

 

 

 

 

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值