java 中的注解

jdk 5.0 新增了注解
注解就是代码里的特殊标记以@开头,这些标记可以在编译,
类加载,运行时,被读取。在不改变原有逻辑上,执行一些操作
以至于在源文件中补充一些信息
常言道: 框架 = 注解 + 反射 + 设计模式
现在主流的spring全家桶,甚至myabtis等主流框架,都支持了注解,省去了繁琐的xml配置文件

jdk 内置了3个注解,这些就不说了

  • @Override:限定重写父类方法,该注解只能用于方法,一般继承或者实现接口的时候,编译器都会生成
  • @Deprecated:用于提示所修饰的元素(方法,类)已过时
  • @SuppressWarnings():忽视编译器警告,idea 中一般用不到哈哈。

最简单的自定义接口

这才是重中之重啊,后边看到反射,再搭配使用效果更佳。
如何自定义注解?

Annotation 中的属性看起来像无参方法,但要注意,他不是方法啊,他是成员变量。
类型只能是八种基本类型.
如果只有一个属性了,那建议用value命名
如果没有属性,我们称之为标记
如果想设置默认值,就要用 default 来定义了

  1. /**
  2. * 自定义注解
  3. */
  4. public @interface MyAnnotation {
  5. String value() default "hello";
  6. }

这样最简单的注解就完成了!
使用的时候 只需要 @MyAnnotation(value = “hello”) 就可以

元注解

jdk 中的元注解就是修饰注解的注解(疯狂套娃)
jdk 中有四种元注解

@Retention 用于指定 被修饰的Annotation 的生命周期

内部包含了一个 RetentionPolicy 类型的成员变量可以指定三个值

  • RetentionPolicy.SOURCE
    在编译(javac 命令)的时候就没了,class文件中不会保留该注解
  • RetentionPolicy.CLASS
    编译后保留在class文件中,但是在执行java 命令的时候就不会加载了
  • RetentionPolicy.RUNTIME
    编译有,运行的时候也有,甚至加载在内存中了

一般情况下都会通过反射来获取注解的内容,所以大多时候都是 指定为 运行时即RetentionPolicy.RUNTIME

@Target

用于指定该注解能够修饰那些元素,比如说类,方法,属性
可用的值为:
TYPE, FIELD, METHOD, PARAMETER, CONSTRUCTOR, LOCAL_VARIABLE, TYPE_PARAMETER, TYPE_USE
其中:
TYPE: 表示可用于修饰类
FIELD: 表示可用于修饰属性
TYPE_PARAMETER: 表示可用在范型上,jdk8新特性
TYPE_USE: 只要是类型上都可以使用注解,jdk8新特性,可以先不理解
其他的应该一眼就明白修饰什么吧?嘿嘿

  1. @Retention(RetentionPolicy.RUNTIME)
  2. @Target({ElementType.METHOD,ElementType.TYPE})
  3. public @interface MyAnnotation {
  4. String value() default "hello";
  5. }

如果没有使用@Target 注解,那么默认所有都可以使用

@Documented @Inherited

这两个注解一般用不上
使用 @Documented注解时,执行 javadoc 命令可以提取出文档
使用时 @Inherited注解时 ,其子类也会带上该类注解(也就是注解也具有继承性了)

通过反射获取注解信息

暂存