Annotation In Java

1. 註解的應用場景

Java註解就是源代碼裏面的覺得用來標識代碼的一些元信息,沒有相關處理這些註解的代碼的話,這些註解就是文本文檔(沒有用處);主要應用場景是: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";ide

一個子類工具

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

}

如上假定實現了相似於SpringMVC的功能,那麼經過GET http://localhost:port/helloworldsub/index 也能夠獲取到"helloworld"字符串,由於咱們定義的@Controller 是Inherited.net

相關文章
相關標籤/搜索