Java- 注解
阅读数:159 评论数:0
跳转到新版页面分类
python/Java
正文
用于描述Java源代码,使得我们能够以将由编译器来测试和验证的格式,存储有关程序的额外信息。使用时在@后面跟注解的名字。
1、预定义的三个注解
(1)Override
标识某一个方法是否覆盖了它的父类的方法。
(2)Deprecated
标注一个类成员时,编译器会发出警告信息。
(3)SuppressWarnings
就是抑制编译器产生警告信息。关键字如下:
all 屏蔽所有报警
boxing 屏蔽和装解箱相关的报警
cast 屏蔽和类型转的是相关的报警
dep-ann 屏蔽和deprecated 注解相关的报警
deprecation 屏蔽和不推荐(deprecated)相关的报警
falthrough 屏蔽在switch中缺少break产生的报警
finally 屏蔽finally块不return的报警
hiding 屏蔽和本地有隐藏变量相关的报警
incomplete-switch 屏蔽switch中缺少case相关的报警
nls 屏蔽和non-nls(no national language support)字符值相关的报警
null 屏蔽和null分析相关的报警
rawtypes 屏蔽当使用泛型时的报警
restriction 屏蔽使用不推荐或禁用的引用时的报警
serial 屏蔽序列化中缺少serialVerisonUID的报警
static-access 屏蔽不正确的静态访问的报警
synthetic-access 屏蔽来自内部类的非优化访问的报警
unchecked 屏蔽没有进行类型检查操作的报警
unqulified-field-access 屏蔽没有权限访问的报警
unused 屏蔽没有使用过的代码的报警
2、自定义注解
注解的定义和接口差不多,只是在interface前面多一个“@”
public @interface MyAnnotation
{
}
上面的代码是个最简单的注解,这个注解没有属性。当然也可以定义有属性的注解。参数成员只能用基本类型等数据类型。如果只有一个参数成员,最好把参数名称设为“value”,后加小括号。
public @interface MyAnnotation
{
String value();
}
可以按如下格式使用MyAnnotation
@MyAnnotation("abc")
public void myMethod()
{
}
这里有一个约定,如果没有写属性名的值,而这个注解又有value属性,就将这个值给value属性,如果没有,就出现编译错误。
除了可以省略属性名,还可以省略属性值,这就是默认值。
public @interface MyAnnotation
{
public String value() default "xyz";
}
可以直接使用MyAnnotation
@MyAnnotation
public void myMehtod()
{
}
3、元注解(对注解进行注解)
(1)Target
@Target({ElementType.METHOD})
public @interface MyAnnotation{}
@MyAnnotaion //wrong!
public class Class1
{
@MyAnnotation //right!
public void myMethod(){}
}
target所指的目标就是Java的语言元素,如类、接口、方法等。
- CONSTRUCTOR,用于描述构造器。
- FIELD,用于描述域。
- LOCAL_VARIABLE,用于描述局部变量
- METHOD,用于描述方法
- PACKAGE,用于描述包
- PARAMETER,用于描述参数
- TYPE,用于描述类、接口或enum声明
(2)Retention
设置注解是否保存在class文件中
@Retention(RetentionPolicy.SOURCE)
@interface MyAnnotation{}
@Retention(RetentionPolicy.CLASS)
@interface MyAnnotation2{}
@Retention(RetentionPolicy.RUNTIME)
@interface MyAnnotation3{}
其中第一段代码的作用是不将注解保存在class文件中,也就是说像“//”一样在编译时被过滤掉了。第二段代码的作用是只将注解保存在class文件中,而使用反射读取注解时忽略这些注解。第三段代码的作用是将注解保存在class文件中,也可以通过反射读取注解。
(3)Documented
在默认的情况下使用javadoc自动生成文档时,注解将被忽略掉,如果想在文档中也包含注解,必须使用Documented为文档注解。
(4)Interited
在默认情况下,父类的注解并不会被子类继承,如果要继承,就必须加上Inherited注解。
@Inherited
@interface MyAnnotation{}
@MyAnnotation
public class ParentClass{}
public class ChildClass extends ParentClass{}
在以上代码中ChildClass和ParentClass一样都已被MyAnnotation注解。
4、使用反射读取注解
实际中最常见的用法。
我们使用反射可以得到类的方法、方法的参数以及其它的类成员等信息。如果要得到某一个类或接口的注解信息,可以使用如下代码:
Annotation annotation = MyClass.class.getAnnotaion(MyAnnotation.class);
如果要得到全部的注解信息:
Annotation[] annotations = MyClass.class.getAnnotations();
或
Annotation[] annotations = MyClass.class.getDeclaredAnnotations();
getDeclaredAnnotations得到的是当前成员所有的注解,不包括继承。