注解

·可以作为配置信息控制程序的运行,注解可以在一些场合用来替代配置文件

    Annotation 注解:程序中给人看到提示信息叫注释,给程序看的提示信息叫做注解

    @xxxx(....)

 

jdk1.5内置的注解:

    @Override: 限定重写父类方法, 该注解只能用于方法

    @Deprecated: 用于表示某个程序元素(类, 方法等)已过时

    @SuppressWarnings: 抑制编译器警告.

 

自定义注解:

1.声明注解

(1)使用 @interface关键字来定义注解

    在这个类中可以声明注解的属性。注解属性的声明类似于在为接口声明一个方法,同时可以为属性设定默认值。

    注解属性支持如下类型:String、基本数据类型、枚举、Class 、其它注解类型、以上数据类型相应一维数组

    如果注解中只包含一个名为value的属性,则这个属性在使用时可以省略注解的名字直接写值


    public @interface Tran{
        //String name();  
        //String name2() default "xxx";
        String value();
    }

(2)使用元注解对注解进行描述

@Retention:用来指定注解的保留范围

    RetentionPolicy.SOURCE: 编译器直接丢弃这种策略的注释

    RetentionPolicy.CLASS: 编译器将把注解记录在 class 文件中. 当运行 Java 程序时, JVM 不会保留注解. 这是默认值

    RetentionPolicy.RUNTIME:编译器将把注释记录在 class 文件中. 当运行 Java 程序时, JVM 会保留注解. 程序可以通过反射获取该注释


@Target:指定被修饰的注解可以使用在什么位置

    ElementType的成员变量。可以是类/方法/字段/构造方法/包声明.....


@Documented: 用于指定被该元 Annotation 修饰的 Annotation 类将被 javadoc 工具提取成文档.


@Inherited: 被它修饰的 Annotation 将具有继承性.

    如果某个类使用了被 @Inherited 修饰的 Annotation, 则其子类将自动具有该注解


2.使用注解

    在 @Target声明的位置上使用 @Tran(属性名=属性值,.....)

 

3.反射注解

    JDK 5.0 在 java.lang.reflect 包下新增了 AnnotatedElement接口, 该接口代表程序中可以接受注释的程序元素,包括Class Field Method Constructor Package都是这个接口的实现,所以这个接口中定义的反射注解的方法,他们都具有    

        T  getAnnotation(ClassannotationClass)

   1.如果存在该元素的指定类型的注解,则返回这些注解,否则返回 null。

         Annotation[] getAnnotations()

   2.返回此元素上存在的所有注解。

         Annotation[] getDeclaredAnnotations()

   3.返回直接存在于此元素上的所有注解。

         boolean isAnnotationPresent(Class annotationClass)

  如果指定类型的注释存在于此元素上,则返回 true,否则返回 false。


获取注解上的属性?获取到注解对象后,就像调用方法一样后去注解的属性



例子


自定义在类上的注解@Description

@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
public @interface Description {
    String value();
}


自定义在方法上的注解@MethodDesc

@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface MethodDesc {
    String name();
}


使用注解

@Description("这是传智播客上海机构,牛")
public class ITCAST_SH {
    @MethodDesc(name="o了,老毕坐镇")
    public void java(){
        System.out.println("这是java学科,神牛");
    }
}


解析注解

public class AnnotationParse {
    @Test
    public void testParse(){
        Class class1 = ITCAST_SH.class;
        if(class1.isAnnotationPresent(Description.class)){
            Description description = (Description)class1.getAnnotation(Description.class);
            if(description.value().contains("传智播客")){
                System.out.println("学费减半");
            }
        }
        Method[] methods = class1.getMethods();
        for(Method method:methods){
            if(method.isAnnotationPresent(MethodDesc.class)){
                MethodDesc methodDesc = (MethodDesc)method.getAnnotation(MethodDesc.class);
                if(methodDesc.name().contains("老毕")){
                    System.out.println("折上折");
                }
            }
        }
    }
}