一、Java中有三个内置的注解
1、@Override
表示当前的方法定义将覆盖超类中的方法,如果出现错误,编译器就会报错。
2、@Deprecated
如果使用此注解,编译器会出现警告信息。一般表示方法即将废弃。
3、@SuppressWarnings
忽略编译器的警告信息。
是不是这几个经常用到的。
二、Java5.0定义的4个元注解
元注解的作用就是负责注解其他注解。Java5.0定义了4个标准的meta-annotation类型,它们被用来提供对其它 annotation类型作说明。这些类型和它们所支持的类在java.lang.annotation包中可以找到。
1、@Target
@Target说明了Annotation所修饰的对象范围:Annotation可被用于 packages、types(类、接口、枚举、Annotation类型)、类型成员(方法、构造方法、成员变量、枚举值)、方法参数和本地变量(如循环变量、catch参数)。在Annotation类型的声明中使用了target可更加明晰其修饰的目标。
作用:用于描述注解的使用范围(即:被描述的注解可以用在什么地方)
CONSTRUCTOR:用于描述构造器
FIELD:用于描述域
LOCAL_VARIABLE:用于描述局部变量
METHOD:用于描述方法
PACKAGE:用于描述包
PARAMETER:用于描述参数
TYPE:用于描述类、接口(包括注解类型) 或enum声明
2、@Retention
@Retention定义了该Annotation被保留的时间长短:某些Annotation仅出现在源代码中,而被编译器丢弃;而另一些却被编译在class文件中;编译在class文件中的Annotation可能会被虚拟机忽略,而另一些在class被装载时将被读取(请注意并不影响class的执行,因为Annotation与class在使用上是被分离的)。使用这个meta-Annotation可以对 Annotation的“生命周期”限制。
SOURCE:在源文件中有效(即源文件保留),仅出现在源代码中,而被编译器丢弃
CLASS:在class文件中有效(即class保留),被编译在class文件中,运行时丢弃
RUNTIME:在运行时有效(即运行时保留),编译在class文件中
3、@Documented
@Documented用于描述其它类型的annotation应该被作为被标注的程序成员的公共API,因此可以被例如javadoc此类的工具文档化。Documented是一个标记注解,没有成员。
是一个生成文档的辅助工具。
4、@Inherited
使用了@Inherited修饰的annotation类型被用于一个class,则这个annotation将被用于该class的子类,@Inherited annotation类型是被标注过的class的子类所继承。
例如父类在类名上声明了@Transactional,子类继承父类,父类的声明的@Transactional会对子类的所有方法进行事务增强。
例子一,Spring的Component注解:
@Target({java.lang.annotation.ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME) //注解保存在JVM运行时刻,能够在运行时刻通过反射API来获取到注解的信息
@Documented
public @interface Component
{
String value() default "";
}例子二,Spring的Transactional注解:
@Target({java.lang.annotation.ElementType.METHOD, java.lang.annotation.ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Inherited //注解可以被继承
@Documented
public @interface Transactional
{
String value() default "";
Propagation propagation() default Propagation.REQUIRED;
Isolation isolation() default Isolation.DEFAULT;
int timeout() default -1;
boolean readOnly() default false;
Class<? extends Throwable>[] rollbackFor() default {};
String[] rollbackForClassName() default {};
Class<? extends Throwable>[] noRollbackFor() default {};
String[] noRollbackForClassName() default {};
}三、自定义注解
1、格式
public @interface 注解名{
定义体
}
2、注解参数的可支持数据类型
1)所有基本数据类型(int,float,boolean,byte,double,char,long,short)
2)String类型
3)Class类型
4)enum类型
5)Annotation类型
6)以上所有类型的数组
3、注解参数的规则
1)修饰符只能是public 或默认(default)
2)参数成员只能用基本类型byte,short,int,long,float,double,boolean八种基本类型和String,Enum,Class,annotations及这些类型的数组
3)如果只有一个参数成员,最好将名称设为"value"
4)注解元素必须有确定的值,可以在注解中定义默认值,也可以使用注解时指定,非基本类型的值不可为null,常使用空字符串或0作默认值
5)在表现一个元素存在或缺失的状态时,定义一下特殊值来表示,如空字符串或负值
647

被折叠的 条评论
为什么被折叠?



