1. 注解的应用场景
Java注解就是源代码里面的以为用来标识代码的一些元信息,没有相关处理这些注解的代码的话,这些注解就是文本文档(没有用处);主要应用场景是:
- JavaDoc,(比如注释里面的@Param)
- javaCompile(告诉编译器一些信息编译器会相应比如@SuppressWarnings,@Override),
- JavaRuntime(主要是用来做反射相关的东西,比如Spring全家桶 @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. 怎么获取注解相关信息
- 反射包里面的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