Java- 注解

阅读数:89 评论数: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的语言元素,如类、接口、方法等。

  1. CONSTRUCTOR,用于描述构造器。
  2. FIELD,用于描述域。
  3. LOCAL_VARIABLE,用于描述局部变量
  4. METHOD,用于描述方法
  5. PACKAGE,用于描述包
  6. PARAMETER,用于描述参数
  7. 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得到的是当前成员所有的注解,不包括继承。



相关推荐

1、类型信息 指程序能够在运行时发现和使用类型信息,我们一般使用两种方式来实现运行时对象和类的信息:传统的RTTI和反射机制。 (1)class对象 <p

作用:用于抑制编译器产生警告信息。该注解可用于类、字段、函数、函数入参、构造函数和函数的局部变量。 如果你确定一个警告不是问题,你就可以使用这个注解,虽然它听起来似乎会屏蔽错误,但

一、概述 1、jvm虚拟机指令 (1)常用指令 new 创建一个对象并将地址放入虚拟机栈 dup 复制一个对象地址放入虚拟机栈 invokespecial 用于调用构造方法、私有方法

Method、Field和Constructor类都继承了AccessibleObject。 默认情况下,反射对象不可访问,当使用Fields,Methods或Constructor来设置或获取字段