文章目录
目录
一、注解是什么?
Annotation (可以被其他程序读取)——》反射
二、元注解
@Target 用于描述注解的使用范围
@Retention 表示需要在什么级别保存该注释信息(source<class<runtime)
@Document:该注解将被包含在javadoc中
@inherited:说明子类可以继承父类中的该注解
package reflect;
import java.lang.annotation.*;
public class test1 {
@MyConfig
public static void main(String[] args) {
}
}
//ElementType.METHOD作用于方法注解
//ElementType.Type作用于类注解
@Target(value = {ElementType.METHOD,ElementType.TYPE})
//表示注解在什么地方有效
@Retention(value = RetentionPolicy.RUNTIME)
//是否生成在doc中
@Documented
//子类可以继承父类的注解
@Inherited
@interface MyConfig{
}
三、自定义注解
- 通过@interface来实现自定义注解
- 其中的每一个方法实际上是声明了一个配置参数。
- 方法的名称就是参数的名称。
- 返回值类型就是参数的类型(返回值只能是基本类型Class , String , enum ))。
- 可以通过default来声明参数的默认值。
- 如果只有一个参数成员,一般参数名为value。
- 注解元素必须要有值,我们定义注解元素时,经常使用空字符串,0作为默认值。
package reflect; import java.lang.annotation.*; public class test2 { //如果没有默认值,则需赋值 @MyConfig1(name = "zyf") public void test(){ } @MyConfig2("ZYF") public void test1(){ } } @Target(value = {ElementType.METHOD,ElementType.TYPE}) //表示注解在什么地方有效 @Retention(value = RetentionPolicy.RUNTIME) @interface MyConfig1{ //注解参数:参数类型+参数名(); String name() default "zyf"; int age() default 0; //默认值为-1,则代表不存在 int id() default 1; String[] schools() default {"南京工业","南京大学"}; } @Target(value = {ElementType.METHOD,ElementType.TYPE}) @Retention(value = RetentionPolicy.RUNTIME) @interface MyConfig2{ //如果是value这个值,那么注解的value即可省去。 String value(); }