注解的作用就是给代码打标签,是代码的元数据,本身没什么作用,需要结合反射进行处理。
Java内置的3个注解: @Override @Deprecated @SuppressWarnings
还有4种元注解,专门提供注解的创建:- @Target 表示该注解可以用于什么地方.可以用的参数包括(可以指定多个,用逗号分隔.调用方法为ElementType.xxx.如果省略这个选项,那么就是可以用于所有地方):
- CONSTRUCTOR
- FIELD (包括enum实例)
- LOCAL_VARIABLE 局部变量
- METHOD
- PACKAGE
- PARAMETER
- TYPE 类 接口 或enum
- @Retention 表示需要在什么级别保存该注解信息.可选的RetentionPolicy参数包括:
- SOURCE 注解将被编译器丢弃
- CLASS 在class文件中可用,但被jvm丢弃
- RUNTIME jvm运行器保留注解,所以可通过反射来获取注解的信息
- @Documented 将此注解包含在javadoc中
- @Inherited 允许子类继承父类的注解
注解的定义方式很像接口,而且也会编译成class文件.
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface Test {}
在注解中一般都会包含一些元素以表示某些值.
注解的元素看起来就像接口中的方法,唯一的区别是你可以为其指定默认值.
没有元素的注解称为标记注解
注解元素可用的类型如下:
- 所有基本类型
- String Class enum Annotation(注解可以嵌套).这是一个示例:
public @interface Uniqueness { Constraints constraints() default @Constraints(unique=true); }
- 以上类型的数组
注解元素默认值的限制:
- 如果没有默认值就必须在使用注解时提供元素的值
- 不能使用null值
定义了注解,声明了注解,还需要定义注解处理器.如果你不处理注解,那么注解他声明也不会做.Java通过反射可以获得注解的信息.
在某些框架如hebernate中,注解比xml配置文件的更好的地方在于:
类名包名已经在Java代码中有了,却还要在配置文件中再描述一次.每当程序员使用外部配置文件时,他就拥有了两个单独的信息源.这经常导致代码同步问题.而且他还要求程序员必须掌握配置文件的编写.
但是也不是绝对的注解就比xml好,注解更适用于业务绑定的服务类.而譬如写SQL这类可能经常会更改的,也许xml会更好一些,以免每改一次sql就重新编译一次Java代码.
快捷方式
@SQLString(30)
类似这样的注解,叫做快捷方式.实际上等同于@SQLString(value=30)
.这样使用是有限制的: 首先必须是value元素,其次只有value元素需要赋值.