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

 

 

你可能感兴趣的:(注解,annotation)