注解是一种应用于类、方法、参数、变量、构造器及包声明中的特殊修饰符。
官方解释如下:
注解是一系列元数据,它提供数据用来解释程序代码,但是注解并非是所解释的代码本身的一部分。注解对于代码的运行效果没有直接影响。
注解有许多用处,主要如下:
看到一篇文章,说注解如同标签,可以贴到需要使用的地方。仔细想来确实挺贴切的,遂记录下来。
注解的定义:使用@interface关键字定义。
public @interface TestAnnotation{
}
注解的定义和接口的定义很相似,只是多了一个@符号。
注解的使用:
@TestAnnotation
public class Users{
}
元注解:
是一种基本注解,专门用于注解其他的注解。在注解类上使用另一个注解类,那么被使用的注解类就称为元注解。
java中主要有四种元注解:@Retention、@Documented、@Target、@Inherited
@Retention:英文翻译为保留,保持;定义该注解的保留策略,即生命周期。
取值如下:
@Retention(RetentionPolicy.RUNTIME)
public @interface TestAnnotation{}
@Documented:表示是否将注解信息添加到java文档中
@Target:表示注解可以用在哪些地方,如果不明确指出,该注解可以放在任何地方。
取值范围如下:
@Inherited:继承,遗传;表示某个类继承父类的注解,只对类元素有效。
比如:父类A有一个注解TestAnnotation,并且使用了@Inherited声明,子类B继承(extends)了父类A,那么类B同时也继承了父类A的注解TestAnnotation。
注解的属性
完整的注解还需要包含一些属性,如下所示:属性名后面需要加括号()。
注:属性的类型必须是 8 种基本数据类型外加 类、接口、注解及它们的数组。
public @interface TestAnnotation{
String name() default "admin";//为name属性设置默认值admin
int userId();
}
使用注解:
@TestAnnotation(name="test",userId=1)
public class Test(){}
若注解只有一个名为value的属性,则使用的时候只需要在注解后面添加值就可以了,不需要写属性名。
若注解没有任何属性,使用时只需要写“@注解名”即可,不用写括号。
需要注意的是,我们使用了自定义的注解后,这些 Annotation 不会自己生效,必须由开发者提供相应的代码来提取并处理 Annotation 信息。
获取注解内容(撕标签,查看标签的内容)
调用注解需要使用反射机制。
/**
*isAnnotationPresent方法用于判断类Test是否使用了某个注解,这里是TestAnnotation
**/
boolean hasAnnotation = Test.class.isAnnotationPresent(TestAnnotation.class);
if ( hasAnnotation ) {
//getAnnotation方法用于获取特定的注解对象,
//也可使用getAnnotations()方法获取该类使用的所有注解
TestAnnotation testAnnotation = Test.class.getAnnotation(TestAnnotation.class);
System.out.println("userId:"+testAnnotation.userId());
System.out.println("name:"+testAnnotation.name());
}
获取属性和方法上使用的注解类似:
//获取一个成员变量上的注解
Field userName = Test.class.getDeclaredField("userName");
userName.setAccessible(true);
TestAnnotation testAnnotation= userName.getAnnotation(TestAnnotation.class);
if ( testAnnotation!= null ) {
System.out.println("annotaiton value:"+testAnnotation.name());
}
// 获取方法中的注解
Method testMethod = Test.class.getDeclaredMethod("testMethod");
if ( testMethod != null ) {
Annotation[] a = testMethod.getAnnotations();
for( int i = 0;i < a.length;i++) {
System.out.println("method annotation:"+ a[i].annotationType().getSimpleName());
}
}
最后附上参考的链接:链接