java深度学习——注解

Java的Annotation在平常开发,特别是java web开发中使用普遍,各类web框架,测试框架多多少少都会引入一些注解。若对java注解有一个全面深刻的了解,对于咱们的开发工做会有很大的帮助。html

Annotation的功能

Annotation是做用于java程序元数据的特殊类型。自己和程序的逻辑隔离,程序的运行逻辑不会被Annotation影响。所以,Annotation在程序中的做用仅限于提供一种信息,定义Annotaiton时即把这种信息和被Annotation修饰的class,method,package等关联了起来。感兴趣的外部程序(如编译器,运行时检查系统,框架,工具等)便可经过反射机制从被修饰类型上获取到关联的Annotation,从而实现特殊的功能。所以能够说Annotaion是一种特殊的注释,是给框架,编译器,运行时检查系统等外部系统看的注释。java

Anntation能够在运行时使用,也能够在编译时使用。在运行时,Annotation是class类的一部分,获取Annotation信息须要经过Class对象。而在编译期使用注解则须要特殊的工具,本文不讨论。web

定义Annotation

Annotation是java中一种独立的类型,用@interface声明,且继承了Annotation接口。定义一个Annotation的目的无非是想注明一个类,一个field,乃至一个package拥有某项信息。所以Anntation的定义是很是轻量的,惟一要作的也只是定义在@interface体中定义一些name value对,定义形式相似于没有方法体的方法。这些name能够有默认值也能够没有默认值。Annotation的域可使用8种基本类型和class,Enum等类型,例以下面代码所示:oracle

@interface TestAnnotation{
    public String testNmae();
    public String testNameValue() default "test";
    public int testIntName() default 10;
}

此外,Annotation定义时须要采用一些元注解来指定注解的属性,这些元注解做用于自定义注解,指定了自定义注解的可见范围,做用对象,是否可继承等属性,具体可见https://docs.oracle.com/javas...框架

@Retention
@Target
@Documented
@Inherited
@Repeatable

使用Annotation

Annotation的使用包括在编译时使用和运行时使用,编译时使用须要Annotation工具,此文不讨论,在运行时使用须要用反射方法去获取注解信息,而后根据获取到的注解信息作自定义的处理。工具

处理Anntation和反射应用同样。首先获取须要处理的类或者方法等的Class对象,再用isAnnotationPresent方法检测指定的Anntation类型是否注解了该类,也能够用Class对象的getAnnotation方法获取到指定的Anntation对象。测试

代码清单1.1是一个简单的Annotation使用示例。this

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

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

//ClassWithAnnotation.java
@Description("this is a class with description annotation")
public class ClassWithAnnotation {

    @AnnotationTest(name="this is a method with annotation")
    public void doSth(){
        System.out.println("i have a annotation");
    }
}

//AnalysisAnnotation .java
public class AnalysisAnnotation {
    public static void main(String[] args){
        try{
            Class<?> rtClass = Class.forName("annotation.ClassWithAnnotation");
            Method[] methods = rtClass.getMethods();
            boolean desctionExist = rtClass.isAnnotationPresent(Description.class);
            if(desctionExist){
                Description description = rtClass.getAnnotation(Description.class);
                System.out.println("class's annotation value:"+description.value());
                for(Method method:methods){
                    if(method.isAnnotationPresent(AnnotationTest.class)){
                        AnnotationTest annotation = method.getAnnotation(AnnotationTest.class);
                        System.out.println("method's anntation value:"+annotation.name());
                    }
                }
            }
        }
        catch(ClassNotFoundException e){
            e.printStackTrace();
        }
    }
}

clipboard.png

运行结果如上。能够看到经过AnalysisAnnotation类中的反射方法获取到了ClassWithAnnotation这个类的注解以及其方法的注解。编译时代码便可这样获取到注解信息,加以利用。运行时注解的一个常见例子是junit等测试框架,或根据注解来实现一些功能。spa

除了运行时可使用注解,在编译时也能够用注解,这个须要特殊的工具支持。经常使用来自动生成代码。code

相关文章
相关标签/搜索