读书人

Java引文总结

发布时间: 2012-08-28 12:37:01 作者: rapoo

Java注解总结

?

一、理解注解

Annotation( 注解 ) 是 JDK5.0 及以后版本引入的一个特性 。 注解是(@interface) Java 的一个新的类型(与接口很相似 ) ,它与类(Class)、接口(interface)、枚举(enum)是在同一个层次。我们可以定义注解、声明注解、获得注解,并且根据获得的注解做相应的处理,许多框架都大量应用了注解,以后继续学习。

?

二、对于java.lang.Annotation的理解

?

所有定义的注解类型到会继承该Annotation接口,定义注解需要使用@interface。

?

以下为定义了一个注解AnnotationTest:

?

package com.hdjava.annotation;

?

public @interface AnnotationTest {

??? String? param = “hello”

??? String[] value () ;

}

?

}

a. 注解可以定义final 静态属性,即使不写明关键字系统也会默认为final静态属性。当注解中的属性名为value时,在对其赋值时可以不指定属性的名称而直接写上属性即可;除了value意外的其他值都需要使用name=value这种复制方式,即明确指定给谁赋值 例如:@AnnotationTest(value=”hello”)或者@AnnotationTest(”hello”)

b. 注解可以定义公共抽象的方法

1. 方法前默认会加上 public abstract

2. 在声明方法时可以定义方法的默认返回值。

例如 : String value() default “hello” ;

3.方法返回值可以是 8 种基本类型, String 、 Class 、枚举、注解及这些类型的数组。

c.注解定义说明

1.当我们使用@interface关键字定义一个注解时,该注解隐含地继承了

java.lang.annotation.Annotation接口;

2.如果我们定义了一个接口,并且让该接口继承自Annotation,那么我们所定义的依然是接口而不是注解;

3.Annotation本身是接口而不是注解。可以与Enum类比。

?

三、三个Java基本注解

?

3.1、@Override

该注解用在方法前面,用来标识该方法是重写父类的某个方法。

?

package com.hdjava.annotation;

public class OverrideTest {

???

??? @Override

??? public String toString() {

?????? return "this is OverrideTest toString";

??? }

}

?

3.2、@Deprecated

该注解的作用是标记某个过时的类或方法。

?

?

package com.hdjava.annotation;

public class DeprecatedTest {

?

?????? @Deprecated

??? public static void doSomething(){

?????? System.out.println("do nothing");

??? }

?

?????? public static void main(String[] args) {

?????? doSomething();

??? }

}

?

3.3、@SuppressWarnings

该注解的作用是阻止编译器发出某些警告信息。

?

它可以有以下参数 :

deprecation :过时的类或方法警告。例如:new Date().toLocal

unchecked :执行了未检查的转换时警告。例如 List list = new ArrayList

fallthrough :当 Switch 程序块直接通往下一种情况而没有 Break 时的警告。

path :在类路径、源文件路径等中有不存在的路径时的警告。

serial :当在可序列化的类上缺少 serialVersionUID 定义时的警告。

finally :任何 finally 子句不能完成时的警告。

all :关于以上所有情况的警告。

?

四、元注解

元注解就是用来对注解类进行注解的注解。

4.1 @Retention

它是被定义在一个注解类的前面,用来说明该注解的生命周期。

它有以下参数:

RetentionPolicy.SOURCE :指定注解只保留在一个源文件当中。

RetentionPolicy.CLASS :指定注解只保留在一个 class 文件中。

RetentionPolicy.RUNTIME :指定注解可以保留在程序运行期间。

?

4.2 RetentionPolicy

?

枚举类型:定义了Retention的类型

public enum RetentionPolicy {

?? ?SOURCE,

??? CLASS,

??? RUNTIME

}

?

4.3 @Target

它是被定义在一个注解类的前面,用来说明该注解可以被声明在哪些元素前。

它有以下参数:

ElementType.TYPE :说明该注解只能被声明在一个类前。

ElementType.FIELD :说明该注解只能被声明在一个类的字段前。

ElementType.METHOD :说明该注解只能被声明在一个类的方法前。

ElementType.PARAMETER :说明该注解只能被声明在一个方法参数前。

ElementType.CONSTRUCTOR :说明该注解只能声明在一个类的构造方法前 。

ElementType.LOCAL_VARIABLE :说明该注解只能声明在一个局部变量前。

ElementType.ANNOTATION_TYPE :说明该注解只能声明在一个注解类型前 。

ElementType.PACKAGE :说明该注解只能声明在一个包名前。

如果不加该注解表示可以声明在任何位置

?

4.4 ElementType

?

枚举类型:定义了Target的类型

?public enum ElementType {

??? TYPE, FIELD, METHOD, PARAMETER, CONSTRUCTOR,

??? LOCAL_VARIABLE, ANNOTATION_TYPE,PACKAGE

?? }

?

4.5 @Documented

如果类型声明是用 Documented 来注释的,则其注释将成为注释元素的公共 API 的一部分。

?

4.6 @Inherited

指示注释类型将被子类自动继承。

?

五、获取注解应用举例

?

新建注解TargetAnnotation 生命周期为RetentionPolicy.SOURCE

?

@Retention(RetentionPolicy.SOURCE)

@Target(ElementType.METHOD)

public @interface TargetAnnotation {

??? String str = "hello";

??? public abstract String value( );

}

?

?

新建注解RetentionAnnotation生命周期为RetentionPolicy.SOURCE

?

@Retention(RetentionPolicy.RUNTIME)

public @interface RetentionAnnotation {

???

??? String name() default "jason";

???

??? String desp();

}

使用注解的类AnnotationTest

public class AnnotationTest {

???

??? @TargetAnnotation("world")

??? @RetentionAnnotation(desp = "jinan")

??? @Deprecated

??? @SuppressWarnings("unchecked")

??? public void output(){

?????? System.out.println("this is method output");

??? }

}

?

获取注解测试类

public class MyReflection {

?

?????? @SuppressWarnings("unchecked")

??? public static void main(String[] args) throws Exception{

?

?????? AnnotationTest test = new AnnotationTest();

?

?????? Class cls = test.getClass();

?????? Method method = cls.getMethod("output", new Class[]{});

?

?????? RetentionAnnotation annotation = method.getAnnotation(RetentionAnnotation.class);

?

?????? Annotation[]annotations = method.getAnnotations();

?

??? System.out.println(annotation.annotationType().getName());

?????? System.out.println(annotation.name());

?????? System.out.println(annotation.desp());

??????

??????

?????? for(@SuppressWarnings("unused")

?????? Annotation a :annotations){

?????????? System.out.println(a.annotationType().getName());

??????????

?????? }

???

??? }

}

运行结果:

jason

jinan

com.hdjava.annotation.RetentionAnnotation

java.lang.Deprecated

?

?

读书人网 >编程

热点推荐