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