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