JAVA自学笔记,Annotation注解

JDK1.5中开始增加了Annotation,它表示注解,它与之前学过的注释是不同的。Annotation是java.lang包下的一个接口,它是代码里的特殊标记,这些标记可以在编译,类加载,运行时被读取,并执行相应的处理,它可用于类,构造方法,成员变量,方法,参数等的声明中,使用Annotation并不影响程序的运行,但是会对编译器警告等辅助工具产生影响。注解主要分为内置注解和自定义注解两种。

内置注解

Java中的内置注解位于java.lang包下,它包含3个基本的注解,分别如下:
1,@Override:限定重写父类方法。
2,@Deprecated:表示已过时
3,@SuooressWarnings:移植编译器警告。
例如我们在代码中重写接口或抽象类中的方法时,就需要用到@Override注解。
在这里插入图片描述

自定义注解

使用自定义注解主要分为一下3个步骤:
1,自定义注解;
2,使用元注解对自定义注解进行设置。
3,反射注解。

自定义注解

在定义Annotation类型时,需要用到用来定义接口的interface关键字,但需要在interface关键字前加一个“@”符号,即定义Annotation类型的关键字为@interface,这个关键字的隐含意思是继承了java.lang.annotation.Annotation接口。例如:

public @interface NoMeberAnnotation{

}

上面定义的Annotation类型@NoMemberAnnotation未包含任何成员,这样的Annotation类型被称为marker annotation。下面定义一个只包含一个成员的Annotation类型

public @interface NoMeberAnnotation{
	String value();
}

String:成员类型。可用的成员类型有String,Class,primitive,enumerated和annotation,以及所列类型的数组。
value:成员名称,如果在所定义的Annotation类型中只包含一个成员,通常将成员名称命名为value。
下面的代码定义了一个包含多个成员的Annotation类型:

public @interface MoreMeberAnnotation{
	String describe():
	Class type():
}

在为Annotation类型定义成员时,也可以为成员设置默认值。例如,下面的代码在定义Annotation类型时就为成员设置了默认值:

public @interface DefaultMeberAnnotation{
	Strign describe() default"<默认值>";
	Class type() default void.class;//void关键字的class类型,用于占位,被任何class类型值覆盖
}
使用元注解对自定义注解进行设置

在自定义注解时,可以使用元注解对自定义的注解进行设置。这里提到了元注解,那么元注解是什么呢?Java中的元注解位于java.lang.annotation包下,他们的主要作用是负责注解其他注解。Java中一共有4个元注解:
1,@Decumented:指示某一类型的注释通过javadoc和类似的默认工具进行文档化
2,@Inherited:指示注解类型被自动继承。
3,@Retention:指示主食类型的注释要保留多久。
4,@Target:指示注解类型所适用的程序元素的种类。
上面4个元注解中,经常用到的是@Target注解和@Retention注解,下面分别介绍:

@Target注解

在自定义Annotation类型时,可以通过元注解@Target来设置Annotation类型使用的程序元素种类,如果未设置@Target,则表示适用于所有程序元素。枚举类型ElementType中的枚举常用来设置@Target:
在这里插入图片描述

@Retention注解

通过元注解@Retention可以设置自定义Annotation的有效范围,枚举类RetentionPolicy中的枚举常量用来设置@Retention。
在这里插入图片描述
如果未设置@Retention,Annotation的有效范围为枚举常量CLASS表示的范围。

反射注解

上面说到在自定义注解时,可以使用@Retention设置注解的有效范围,如果将该注解的值设置为RetentionPolicy.RUNTIME,那么在运行程序时通过反射就可以获取到相关的Annotataion信息,如获取构造方法,成员变量和方法的Annotation信息。
前面介绍过Constructor类Field类和Method类分别用来储存类的构造方法,成员变量和方法信息,它们均继承自AccessibleObject类,而在AccessibleObject类中定义了3个关于Annotation的方法,分别如下:
1,isAnnotationPresent(Class<? extends Annotation> annotationClass)方法:查看是否添加了指定类型的Annotation,如果是则返回true,否则返回false。
2,getAnnotation(ClassannotationClass)方法:获得指定类型的Annotation,如果存在则返回相应的对象,否则返回null。
3,getAnnotations()方法:获得所有的Annotation,该方法将返回一个Annotation数组。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值