1. 注解的应用场景

Java注解就是源代码里面的以为用来标识代码的一些元信息,没有相关处理这些注解的代码的话,这些注解就是文本文档(没有用处);主要应用场景是:

  1. JavaDoc,(比如注释里面的@Param)
  2. javaCompile(告诉编译器一些信息编译器会相应比如@SuppressWarnings,@Override),
  3. JavaRuntime(主要是用来做反射相关的东西,比如Spring全家桶@Bean @Autowire等等)

2. 元注解(用来描述注解的注解)

@Retention 
/**
* 表示所描述的注解有效期,取值范围
* RetentionPolicy.SOURCE 只在源代码时有效,一般就是生成JavaDoc这类工具会使用比如@Override等等,编译器不会处理这些注解
* RetentionPolicy.CLASS 在编译期有效,编译器会读取处理这些注解,生成class文件会有这些注解,但是通过反射是获取不到的,默认是这个级别,但是是假的默认;既然加注解默认都是要反射搞事情的。。
* RetentionPolicy.RUNTIME 运行时有效,class文件里面有,通过反射包可以获取到这些注解,这个才是真默认
*/
@Documented 
/**
 * 生成JavaDoc时,@Documnet所描述的注解--这个注解所描述的元素会加到javadoc里面,别管没什么用...
 */
@Target
/**
 * 描述注解能用在什么地方;取值范围注意是个数组
 * ElementType.ANNOTATION_TYPE 可以被加在注解上
 * ElementType.CONSTRUCTOR 可以被加在构造器上,
 * ElementType.FIELD 可以被加在类的属性成员上
 * ElementType.LOCAL_VARIABLE 可以被加在本地变量上
 * ElementType.METHOD 可以被加在类的方法上
 * ElementType.PACKAGE 可以被加在package上.
 * ElementType.PARAMETER 可以被加在方法的参数上
 * ElementType.TYPE 可以被加在类上
 */
@Inherited
/**
 * 表示这个注解是否可以被子类继承,默认不行
 * 假定A class test()方法被TestAnno 标记,
 * TestAnno  被Inherited 标记, 
 * 那么 B 从A 继承后,尽管B的代码 没有任何TestAnno代码
 * 但是使用反射包对ClassB.getMethodsByName("test").forEach(getAnnotations())...
 * 是会有TestAnno
 */

@Repeatable
/**
 * 表示这个注解是否可以使用多次,在同一个元素上,默认false
 * 1.8 以后才有的
 */

3. 怎么获取注解相关信息

  1. 反射包里面的Class.Method等等工具类

4. 一个自定义注解及解释

@Target({ElementType.METHOD,ElementType.TYPE})//可以被用在方法及类上
@Retention(RetentionPolicy.RUNTIME)//运行时,
@Inherited//可被继承的
public @interface Controller{
    String value() ;//需要给个字符串
    String [] methods();//需要给个字符数组
}

使用的话就这么使用:

@Controller(value="/helloworld",method={"POST","GET"})
public class HelloWorldController{
    @Controller(value="/index",method={"POST","GET"})
    public String helloworld(){
        return "helloworld";
    }
}

如上假定实现了类似于SpringMVC的功能,那么 通过GET http://localhost:port/helloworld/index 就可以获取到"helloworld";

一个子类

@Controller(value="/helloworldsub",method={"POST","GET"})
public class HelloWorldControllerSub extends{

}

如上假定实现了类似于SpringMVC的功能,那么通过GET http://localhost:port/helloworldsub/index 也可以获取到"helloworld"字符串,因为我们定义的@Controller 是Inherited