java 中的注解
jdk 5.0 新增了注解
注解就是代码里的特殊标记以@开头,这些标记可以在编译,
类加载,运行时,被读取。在不改变原有逻辑上,执行一些操作
以至于在源文件中补充一些信息
常言道: 框架 = 注解 + 反射 + 设计模式
现在主流的spring全家桶,甚至myabtis等主流框架,都支持了注解,省去了繁琐的xml配置文件
jdk 内置了3个注解,这些就不说了
- @Override:限定重写父类方法,该注解只能用于方法,一般继承或者实现接口的时候,编译器都会生成
- @Deprecated:用于提示所修饰的元素(方法,类)已过时
- @SuppressWarnings():忽视编译器警告,idea 中一般用不到哈哈。
最简单的自定义接口
这才是重中之重啊,后边看到反射,再搭配使用效果更佳。
如何自定义注解?
Annotation 中的属性看起来像无参方法,但要注意,他不是方法啊,他是成员变量。
类型只能是八种基本类型.
如果只有一个属性了,那建议用value命名
如果没有属性,我们称之为标记
如果想设置默认值,就要用 default 来定义了
/**
* 自定义注解
*/
public @interface MyAnnotation {
String value() default "hello";
}
这样最简单的注解就完成了!
使用的时候 只需要 @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新特性,可以先不理解
其他的应该一眼就明白修饰什么吧?嘿嘿
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.METHOD,ElementType.TYPE})
public @interface MyAnnotation {
String value() default "hello";
}
如果没有使用@Target 注解,那么默认所有都可以使用
@Documented 和 @Inherited
这两个注解一般用不上
使用 @Documented注解时,执行 javadoc 命令可以提取出文档
使用时 @Inherited注解时 ,其子类也会带上该类注解(也就是注解也具有继承性了)
通过反射获取注解信息
暂存