[转]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, 系统也会将属性默认为final。当注解中的属性名为value时,在对其赋值时可以不指定属性名称而直接写上属性值即可;而除了value之外,其他属性都需要使用name=value这种方式赋值. 例如:

@AnnotationTest(value=”hello”)或者@AnnotationTest(”hello”) 

    b. 注解可以定义公共抽象的方法 
  • 方法前默认会加上 public abstract 
  • 在声明方法时可以使用关键字default定义方法的默认返回值。 
例如 : 
String value() default “hello” ; 

  • 方法返回值可以是 8 种基本类型, String 、 Class 、枚举、注解及这些类型的数组。 
    c.注解定义说明 
  • 当我们使用@interface关键字定义一个注解时,该注解隐含地继承了java.lang.annotation.Annotation接口; 
  • 如果我们定义了一个接口,并且让该接口继承自Annotation,那么我们所定义的依然是接口而不是注解; 
  • Annotation本身是接口而不是注解。可以与Enum类比。 
三、三个Java基本注解 
  • @Override 注解
该注解用在方法前面,用来标识该方法是重写父类的某个方法。 (该注解可以让编译器检查某个方法是否覆盖了父类的方法,如果不是,会给出编译错误的提示)
package com.hdjava.annotation; 
    public class OverrideTest { 
        @Override 
        public String toString() { 
            return "this is OverrideTest toString"; 
        } 
} 

  • @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(); 
        } 
} 

  • @SuppressWarnings 注解
    该注解的作用是阻止编译器发出某些警告信息。  它可以有以下参数 : 
        deprecation :过时的类或方法警告。例如:new Date().toLocal 
        unchecked :执行了未检查的转换时警告。例如 List list = new ArrayList 
        fallthrough :当 Switch 程序块直接通往下一种情况而没有 Break 时的警告。 
        path :在类路径、源文件路径等中有不存在的路径时的警告。 
        serial :当在可序列化的类上缺少 serialVersionUID 定义时的警告。 
        finally :任何 finally 子句不能完成时的警告。 

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

四、元注解 

    元注解就是用来对注解类进行注解的注解。 
  • @Retention 注解
    它是被定义在一个注解类的前面,用来说明该注解的生命周期。  它有以下参数: 
        RetentionPolicy.SOURCE :指定注解只保留在一个源文件当中。 
        RetentionPolicy.CLASS :指定注解只保留在一个 class 文件中。 
        RetentionPolicy.RUNTIME :指定注解可以保留在程序运行期间。 

  • @RetentionPolicy 注解

        枚举类型:定义了Retention的类型 
public enum RetentionPolicy { 
    SOURCE, CLASS, RUNTIME 
} 

  • @Target 注解
    它是被定义在一个注解类的前面,用来说明该注解可以被声明在哪些元素前面。 它有以下参数: 
        ElementType.TYPE :说明该注解只能被声明在一个类前。 
        ElementType.FIELD :说明该注解只能被声明在一个类的字段前。 
        ElementType.METHOD :说明该注解只能被声明在一个类的方法前。 
        ElementType.PARAMETER :说明该注解只能被声明在一个方法参数前。 
        ElementType.CONSTRUCTOR :说明该注解只能声明在一个类的构造方法前 。 
        ElementType.LOCAL_VARIABLE :说明该注解只能声明在一个局部变量前。 
        ElementType.ANNOTATION_TYPE :说明该注解只能声明在一个注解类型前 。 
        ElementType.PACKAGE :说明该注解只能声明在一个包名前。 
        如果不加该注解表示可以声明在任何位置 

  • @ElementType 注解

        枚举类型:定义了Target的类型 
public enum ElementType { 
    TYPE, FIELD, METHOD, PARAMETER, CONSTRUCTOR, LOCAL_VARIABLE, ANNOTATION_TYPE,PACKAGE 
} 

  • @Documented 注解

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

  • @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

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