Java注解笔记

2018-05-03  本文已影响0人  ZGYSYY

什么是注解?

  1. 注解不是注释,注释是给程序员看的,而注解是给程序看的。
  2. 注解用来描述程序如何运行及在什么阶段来运行。
  3. 注解在实际开发中,最大的功能就是替换配置文件。
  4. 注解是JDK1.5的新特性。
  5. 可以通过反射来让注解具有功能。
  6. 注解的格式:@XXX 。
  7. 注解的本质就是一个接口,这个接口需要继承Annotation接口。

三个基本的注解:

  1. @Override:检查子类是否重写了父类的方法,如果不加该注解,就不检查。
  2. @Deprecated:说明已经过时。
  3. @SuppressWarnings({"unused"}):抑制程序中的警告,unused是警告的类型,意思是没有使用过的方法或变量不警告,{}是数组,如果将unused替换成all是抑制所有警告。

如何来声明注解?

  1. 声明一个注解:@interface 注解名{}
  2. 声明注解中的成员,成员包括:基本类型、String、枚举、注解、Class、以上类型的一维数组。
  3. 注解的使用,在类、方法、变量上使用@定义的注解名。

式例代码:

package com.zgy.annotation;

public @interface MyAnnotation {

    int a() default 1;
    String b() default "ZGY";
    String[] c() default {};
    Class d() default Object.class;
}

package com.zgy.annotation;

public class Demo {

    @MyAnnotation(a=2,b="YGZ",c= {"AA","BB"},d=String.class)
    public void test01() {
        
    }
}

模拟Junit单元测试

式例代码:

@Retention(RetentionPolicy.RUNTIME):注解的运行策略,RetentionPolicy.RUNTIME表示运行时执行。

package com.zgy.annotation;

import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;

@Retention(RetentionPolicy.RUNTIME)
public @interface MyJunit {

    String name() default "ZGY";
}

package com.zgy.annotation;

public class Demo2 {

    @MyJunit(name="LHM")
    public void test01() {
        System.out.println("运行Test01方法");
    }
    
    @MyJunit
    public void test02() {
        System.out.println("运行Test02方法");
    }
    
    public void test03() {
        System.out.println("运行Test03方法");
    }
}

package com.zgy.annotation;

import java.lang.reflect.Method;

public class Demo3 {

    public static void main(String[] args) throws Exception {
        //通过反射获取Demo2类中的所有方法
        Method[] methods = Demo2.class.getMethods();
        for(Method m : methods) {
            //去掉继承自Object的方法
            if(m.getName().startsWith("test")) {
                //获取方法上的注解
                MyJunit junit = m.getAnnotation(MyJunit.class);
                //获取注解中定义的成员的值
                if(junit != null) {
                    System.out.println("name:"+junit.name());
                    //调用被注解的方法
                    m.invoke(Demo2.class.newInstance());
                }
            
            }
        }
    }
}

元注解

  1. 什么时元注解:只能用在注解上的注解。及修饰注解的注解。

注解的存活范围:Source(源码),Class(字节码),Runtime(运行时)

  1. @Retention:作用是改变自定义注解的存活范围,默认是Class,意思是在编译成class文件后,注解就不存在了。有三个值分别为:
    RetentionPolicy.SOURCE
    RetentionPolicy.CLASS
    RetentionPolicy.RUNTIME
  2. @Target:作用是指定该注解能用到什么地方,有以下几个值:
    ElemenType.TYPE
    ElemenType.METHOD
    ElemenType.FIELD
    ElemenType.ANNOTATION_TYPE
  3. @Documented:跟生成API有关。
  4. Inherited:说明该注解可以被继承下去。
上一篇 下一篇

猜你喜欢

热点阅读