Java_注解Annotation

1.注解(Annotation)概述

        (1).什么是注解

                JDK5.0中提供了注解的功能,允许开发者定义和使用自己的注解类型。该功能由一个定义注解类型的语法和描述一个注解声明的语法。
                Annotation并不直接影响代码的语义,但是他可以被看做是程序的工具或者类库。

        (2).注解存在状态

               Annotation存在三种状态源文件,class文件,运行时默认是 Retention(RetentionPolicy.CLASS)

        所以,源文件(@Override,@SuppressWarnings)   运行时(@Deprecated)

2.常见注解

    (1).@Override注解

         @Target(value=METHOD)
         @Retention(value=SOURCE)
         public @interface Override

         表示子类要重写父类的对应方法。

        Override是一个Marker annotation,用于标识的Annotation,Annotation名称本身表示了要给工具程序的信息。

    (2).@Deprecated注解

         @Documented
         @Retention(value=RUNTIME)
         public @interface Deprecated

         表示方法是不被建议使用的

    (3).@SuppressWarnings注解

         @Target(value={TYPE,FIELD,METHOD,PARAMETER,CONSTRUCTOR,LOCAL_VARIABLE})
         @Retention(value=SOURCE)
         public @interface SuppressWarnings

         指示应该在注释元素(以及包含在该注释元素中的所有程序元素)中取消显示指定的编译器警告

    (4).@Retention注解

        @Retention(RetentionPolicy.RUNTIME)
            SOURCE,编译器要丢弃的注释。
            CLASS,编译器将把注释记录在类文件中,但在运行时 VM 不需要保留注释
            RUNTIME,编译器将把注释记录在类文件中,在运行时 VM 将保留注释,因此可以反射性地读取。

    (5).@Target注解

        @Target({ElementType.TYPE, ElementType.METHOD})//是数组
            ANNOTATION_TYPE 注释类型声明
            CONSTRUCTOR 构造方法声明
            FIELD 字段声明(包括枚举常量)
            LOCAL_VARIABLE 局部变量声明
            METHOD 方法声明
            PACKAGE 包声明
            PARAMETER 参数声明

            TYPE 类、接口(包括注释类型)或枚举声明

3.数组细节知识

    知识: @Target(ElementType[] value),value为数组,可以定义 @Target({ElementType.TYPE, ElementType.METHOD})
    如果value数组只有一个元素,可以省略{},简写为 @Target(ElementType.TYPE},该value[0]=ElementType.TYPE;

4.自定义注解

    (1).格式

        @Retention(RetentionPolicy.RUNTIME)//注释一直保存至运行
        public @interface AnnotationDemo {

        }

        //
        @AnnotationDemo
        public class Test {
         public static void main(String[] args) throws Exception {
          if(Test.class.isAnnotationPresent(AnnotationDemo.class)){//判断Test类中,是否存在AnnotationDemo注解
                     //!函数区别 boolean isAnnotation()  如果此 Class 对象表示一个注释类型则返回 true。
           AnnotationDemo annotation = (AnnotationDemo)Test.class.getAnnotation(AnnotationDemo.class);//得到注解
           System.out.println(annotation);
          }
         }

    (2).注解类成员

        基本数据,枚举,类,数组,注解等
    使用时按照格式来操作,可以添加默认值,相信看下面代码!

/*
	主函数
	Strawberry2013/5/17
*/
@AnnotationDemo(name="zhang", age=30, en=EnumDemo.RED, anno=@Anno("efg"), country={"China","USA"})//无序
public class Test {
	public static void main(String[] args) throws Exception {
		if(Test.class.isAnnotationPresent(AnnotationDemo.class)){//判断是否存在AnnotationDemo注解
			AnnotationDemo annotation = (AnnotationDemo)Test.class.getAnnotation(AnnotationDemo.class);
			System.out.println(annotation.country()[1]);//println(Object),由于String[]是Object的子类,打印的是整体的数组地址
			System.out.println(annotation.en().next());//en()方法获得枚举,next()为枚举对应的方法
			System.out.println(annotation.anno().value());//anno()获得注解对象,value()为注解的注解
		}
	}
}
 
/*
	注解类AnnotationDemo
	Strawberry2013/5/17
*/
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;

@Retention(RetentionPolicy.RUNTIME)//设定注解存在至运行时
public @interface AnnotationDemo {//注意注解的格式
	String name();			//注解成员的定义格式,注意括号~
	int age() default 20;	//设置默认值,在定义该注解时,可以省略该成员的赋值
	Anno anno();			//注解成员
	EnumDemo en();			//枚举成员
	String[] country();		//数值成员,在数值长度为1时,可以省略{}
	
}
 
/*
	枚举类EnumDemo
	Strawberry2013/5/17
*/
public enum EnumDemo {
	RED{
		public EnumDemo next(){
			return GREEN;
		}
	},
	GREEN{
		public EnumDemo next() {
			return YELLOW;
		}
	},
	YELLOW{
		public EnumDemo next(){
			return RED;
		}
	};
	public abstract EnumDemo next();
}
 
/*
	注解AnnotationDemo的注解类
	Strawberry2013/5/17
*/
public @interface Anno {
	String value() default "abc";
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值