java注解Annotation


什么是注解
先以我们知道的知识来引入,当我们新建一个类的时候,我们要重写 toString 方法,就会写如下的代码:
@Override
public String toString(){
return "something";
}
这里的 @Override
就是一个注解。它标明了 toString 是一个”重写”方法.
所以 注解就是为我们的代码添加额外的声明,提供额外的信息。
我们可以为 “包”,“类”,“属性”,“方法”,“方法参数“ 等添加信息,因此 注解 可以应用在这些上面。
如何声明一个注解
注解和接口的声明差不多。注解使用的关键字是 @interface
声明一个名为 IsUseful 的注解
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@interface IsUseful {}
元注解
我们可以看到,在注解上方还有 @Target
@Retention
,这相当于注解的注解。
就是描述注解的信息,我们称之为“元注解”。
@Target
@Target
元注解表明了此此注解可以应用在什么地方。
其值常见的有
ElementType.TYPE 指注解应用在“类”上
ElementType.FIELD 指注解应用在“字段”上
ElementType.METHOD 指注解应用在“方法”上
为Target指定多个值
@Target(value={ElementType.TYPE,ElementType.METHOD}) //表明应用到方法和类上面
@Retention(RetentionPolicy.RUNTIME)
@interface IsUseful {
}
@Retention
@Retention
元注解表明了此此注解保留到什么时候,什么时候还有它。
RetentionPolicy.RUNTIME 指注解保留到运行时。
RetentionPolicy.CLASS 指注解保留到编译阶段,即 class 文件时期。
RetentionPolicy.SOURCE 指注解只是在java源文件中存在,其它时候都没有。
注解属性
我们还可以为注解添加属性信息,和类中的字段差不多。
@Target(value={ElementType.TYPE,ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@interface IsUseful {
//定义了一个 who 属性,默认值为 me
String who() default "me";
}
属性类型还可以是其它类型,比如 枚举。
注解的使用
声明好注解后,就可以使用了,使用方法和 @override
相同。
@IsUseful(who="xiaoming")
class Person{
@IsUseful
public void say(){}
}
注解和反射
当在类或者方法上应用注解后,我们可以通过反射来判断和获取注解信息
//通过反射判断是否使用了某个注解
boolean isUseful = Person.class.isAnnotationPresent(IsUseful.class);
P.print(isUseful);
//获取注解的信息
IsUseful isUseful1 = Person.class.getAnnotation(IsUseful.class);
P.print(isUseful1);
P.print(isUseful1.who());
输出结果
true
@AnnotationDemo.IsUseful(who=xiaoming)
xiaoming
扫码分享
版权说明
作者:SQBER
本文版权归作者所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
{0}
{5}
{1}
{2}回复
{4}
*昵称:
*邮箱:
个人站点:
*想说的话: