注解进阶之自定义注解

自定义注解,使用关键字@interface 跟定义类是一个道理的。里面也是可以定义字段,数组,不过仅支持基本类型,枚举类型,还有注解类型(也就是注解可以给注解当变量)

package cn.anotation;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
/**
 * @author Panlin
 *
 */
Target(ElementType.TYPE)    //元注解 指明这个person这个注解只能放在类外面进行限定
@Retention(RetentionPolicy.RUNTIME)   //元注解, matedata  就是注解的注解,主要指明这个注解的主要规范对象的保存范围
public @interface Person { //定义了这个注解的名称
 String  name() ;  //定义了注解的字段 姓名 默认值为空字符串
 int age();//定义了注解字段年龄,默认的的为0 如果没有默认值,则必须在使用注解的时候,显示的指示出来.
 boolean married() default false;
 String []childrenName() default "";
}

注意如果上面有default的的字段,可以不填写,不填写的话,默认的初始值是后面的default。

但是没有default的字段,必须要填写,否则你就编译就通过不了了。

在使用上面的注解进行限定一个类的时候,我们可以这样使用了

 @Person(age=19,name="panlin",childrenName={"aaa","bbb","ccc"})
class panlin{
 
}

这样写的好处,就是,我们用注解在编译前就限定了几个变量的初始值,虽然上面的限定知识在source阶段,就是仅仅在源文件中,对程序运行并起不到任何作用。但是可以明白一点是注解可以像XML一样在程序严格现在程序的初始化、

 

有了上面的基础,我们就可以在选择读取注解中自己定义的字段的值了

 @SuppressWarnings("all")
@Person(age=19,name="panlin",childrenName={"aaa","bbb","ccc"})
public class demo1{
  public static void main(String[] args) {
   
      Class clazz=demo1.class;
      Person p= (Person) clazz.getAnnotation(Person.class);  //获得指定类型的 注解 并强转成指定类型
   System.out.println("name"+p.name());
   System.out.println("age"+p.age());
   System.out.println("ismarried"+p.married());
   System.out.println("childrenName"+p.childrenName()[0]);
  }
}

程序的运行结果如下

<Annotation> 注解进阶之自定义注解

你可能感兴趣的:( 注解进阶之自定义注解)