一、自定义注解:
@Target(value=ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
public @interface MyAnnotation{
Stirng studentName() default "";
int age() default 0;
//若default的值为-1表示不存在
int id() default -1;
//数组可以不用设置默认值
String[] names() default {"dsv","dd"};
}
//使用上面的注解
public class Demo{
@MyAnnotation(age=19,studentName="pengpeng") //添加参数值
public void test(){
}
}
二、自定义的注解通常要添加一些元注解,元注解有四种。
(1)@Target
:用于描述注解的范围(@Target(value=ElementType.TYPE)
或者@Target(value={ElementType.METHOD,ELementType.TYPE})
)
所修饰的范围 | 取值ElementType |
---|---|
package包 | PACKAGE(只能用在包的前面) |
类、接口、枚举、Annotation类型 | TYPE |
类型成员(方法、构造方法、成员变量、枚举值) | CONSTRUCTOR用于描述 构造器 、FILED用于描述域、METHOD用于描述方法 |
方法参数和本地变量 | LOCAL_VARIABLE用于描述局部变量;PARAMETER用于描述参数 |
(2)@Retention
:表示需要在什么级别保存该注释信息,用于描述注解的生命周期。(@Retention(RetentionPolicy.RUNTIME)
)
取值RetentionPolicy | 作用 |
---|---|
SOURCE | 在源文件中有效(即源文件保留) |
CLASS | 在class文件中有效 |
RUNTIME | 在运行时有效(即运行时保留)为RUNTIME可以为反射机制读取 |
(3)@Documented
:用于描述其它类型的annotation应该被作为被标注的程序成员的公共API,因此可以被例如javadoc此类的工具文档化。Documented是一个标记注解,没有成员。
(4)@Inherited
:@Inherited 元注解是一个标记注解,@Inherited阐述了某个被标注的类型是被继承的。如果一个使用了@Inherited修饰的annotation类型被用于一个class,则这个annotation将被用于该class的子类。