Java注解就是源代码里面的觉得用来标识代码的一些元信息,没有相关处理这些注解的代码的话,这些注解就是文本文档(没有用处);主要应用场景是:java
@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 之后才有的 */
@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";ide
一个子类工具
@Controller(value="/helloworldsub",method={"POST","GET"}) public class HelloWorldControllerSub extends{ }
如上假定实现了相似于SpringMVC的功能,那么经过GET http://localhost:port/helloworldsub/index
也能够获取到"helloworld"字符串,由于咱们定义的@Controller 是Inherited.net