自定义注解

那么什么是注解呢?

注解的定义:

其实就是一个特性的组件一个类型元数据的绑定 该元数据 的添加只不过是给编译器识别的 当编译器将.java编译成 .class的时候 类型元数据跟着原有的数据信息一起被持久化 等到jvm 通过classLoader将.class装载到64mb的jvm 的特定区域时 我们可以 通过反射机制 去获取到有特定标记(类型元数据)的组件上的数据信息 (这个时候的数据信息 可以看成是经过jvm进行加工的程序员可以识别的数据信息)数据获取到内存变量后 可以为后续的(数据)程序做铺垫。

注解: 标记注解 一般注解 标准元注解

 注解都是什么呢?看下面这张图就明白了!

  上面的图可以看出,注解大体上分为三种:标记注解,一般注解,元注解

 

@Override用于标识,该方法是继承自超类的。这样,当超类的方法修改后,实现类就可以直接看到了。

  而@Deprecated注解,则是标识当前方法或者类已经不推荐使用,如果用户还是要使用,会生成编译的警告。

  上面的测试,也仅仅是针对IDE,如果是利用javac,应该会有提示的。

 

  其他的不多说了,标准元注解 都是干嘛的呢?

  @Documented 标记生成javadoc

  @Inherited 标记继承关系

  @Retention 注解的生存期

  @Target 标注的目标

  

下面我们自己做一个注解!

  首先声明一个接口,并未它添加注解内容!

复制代码
 1 package testAnnotation;
 2 
 3 import java.lang.annotation.Documented;
 4 import java.lang.annotation.Retention;
 5 import java.lang.annotation.RetentionPolicy;
 6 
 7 @Documented
 8 @Retention(RetentionPolicy.RUNTIME)
 9 public @interface Person{
10     String name();
11     int age();
12 }
复制代码

  一般来说,注解都是搭配反射的解析器共同工作的。然后利用反射机制查看类的注解内容

复制代码
 1 package testAnnotation;
 2 
 3 @Person(name="xingoo",age=25)
 4 public class test3 {
 5     public static void print(Class c){
 6         System.out.println(c.getName());
 7         
 8         //java.lang.Class的getAnnotation方法,如果有注解,则返回注解。否则返回null
 9         Person person = (Person)c.getAnnotation(Person.class);
10         
11         if(person != null){
12             System.out.println("name:"+person.name()+" age:"+person.age());
13         }else{
14             System.out.println("person unknown!");
15         }
16     }
17     public static void main(String[] args){
18         test3.print(test3.class);
19     }
20 }
复制代码

  运行结果,读取到了注解的内容

testAnnotation.test3
name:xingoo age:25
posted @ 2019-01-15 09:37  H丶  阅读(234)  评论(0编辑  收藏  举报