註解的做用

  1. 編譯檢查
    Annotation具備「讓編譯器進行編譯檢查的做用」。
    例如,@SuppressWarnings, @Deprecated和@Override都具備編譯檢查做用。
  2. 在反射中使用Annotation
    在反射的Class, Method, Field等函數中,有許多於Annotation相關的接口。
    這也意味着,咱們能夠在反射中解析並使用Annotation。
  3. 根據Annotation生成幫助文檔
    經過給Annotation註解加上@Documented標籤,能使該Annotation標籤出如今javadoc中。
  4. 可以幫忙查看查看代碼
    經過@Override, @Deprecated等,咱們能很方便的瞭解程序的大體結構。
    另外,咱們也能夠經過自定義Annotation來實現一些功能。
    5.註解處理器
    若是沒有用來讀取註解的方法和工做,那麼註解也就不會比註釋更有用處了。使用註解的過程當中,很重要的一部分就是建立於使用註解處理器。Java SE5擴展了反射機制的API,以幫助程序員快速的構造自定義註解處理器。
  5. 在框架中的做用
    在開發Java程序,尤爲是Java EE應用的時候,老是免不了與各類配置文件打交道。以Java EE中典型的S(pring)S(truts)H(ibernate)架構來講,Spring、Struts和Hibernate這三個框架都有本身的XML格式的配置文件。這些配置文件須要與Java源代碼保存同步,不然的話就可能出現錯誤。並且這些錯誤有可能到了運行時刻才被發現。把同一份信息保存在兩個地方,老是個壞的主意。理想的狀況是在一個地方維護這些信息就行了。其它部分所需的信息則經過自動的方式來生成。JDK 5中引入了源代碼中的註解(annotation)這一機制。註解使得Java源代碼中不但能夠包含功能性的實現代碼,還能夠添加元數據。註解的功能相似於代碼中的註釋,所不一樣的是註解不是提供代碼功能的說明,而是實現程序功能的重要組成部分。Java註解已經在不少框架中獲得了普遍的使用,用來簡化程序中的配置。
    由於註解大多都有本身的配置參數,而配置參數以名值對的方式出現,因此從某種角度來講,能夠把註解當作是一個XML元素,該元素能夠有不一樣的預約義的屬性。
    而屬性的值是能夠在聲明該元素的時候自行指定的。在代碼中使用註解,就至關於把一部分元數據從XML文件移到了代碼自己之中,在一個地方管理和維護。
    上面兩段話其實已經闡述了java註解的主要做用之一,就是跟蹤代碼依賴性,實現替代配置文件功能。比較常見的是Spring等框架中的基於註解配置。如今的框架不少都使用了這種方式來減小配置文件的數量。基本上秉持着這麼一個原則,與具體場景相關的配置應該使用註解的方式與數據關聯,與具體場景無關的配置放於配置文件中。在另外一方面咱們還能夠在經過設置註解的@Retention 級別在運行時使用反射對不一樣的註解進行處理。

怎麼使用呢?
例子:先利用反射,獲取到註解,而後把利用註解實例化該類的對象
下面有一個例子:(本身寫的哦)
定義一個註解java

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface FruitProvider {
    /*供應商編號*/
    public int id() default -1;
    /*供應商名稱*/
    public String name() default "";
    /*供應商地址*/
    public String address() default "";
}

對一個類使用註解程序員

@FruitProvider(id = 1728, name = "why", address = "shenzhen")
public class Apple {
    private int appleID;
    private String appleProvidername;
    private String appleprovideraddress;

    public int getAppleID() {
        return appleID;
    }

    public void setAppleID(int appleID) {
        this.appleID = appleID;
    }

    public String getAppleProvidername() {
        return appleProvidername;
    }

    public void setAppleProvidername(String appleProvidername) {
        this.appleProvidername = appleProvidername;
    }

    public String getAppleprovideraddress() {
        return appleprovideraddress;
    }

    public void setAppleprovideraddress(String appleprovideraddress) {
        this.appleprovideraddress = appleprovideraddress;
    }
}

註解處理器架構

public class FruitInfoUtil {

    public static Apple getAApple(Class<?> clazz) throws Exception{
        FruitProvider fb = clazz.getAnnotation(FruitProvider.class);//經過反射獲取處理註釋
        //經過newInstance()生成Apple實例,利用反射的結果進行設置
        Apple ap = (Apple)clazz.newInstance();
        ap.setAppleID(fb.id());
        ap.setAppleProvidername(fb.name());
        ap.setAppleprovideraddress(fb.address());
        return ap;
    }
}
public class Main {

    public static void main(String[] args) throws  Exception{
        Apple a = FruitInfoUtil.getAApple(Apple.class);
        System.out.println("蘋果商的ID爲:"+a.getAppleID());
        System.out.println("蘋果商的名字爲:"+a.getAppleProvidername());
        System.out.println("蘋果商的地址爲:"+a.getAppleprovideraddress());
    }
}

這個實例就很好的說明,如今的框架不少都使用了這種方式來減小配置文件的數量。(由於配置就在代碼裏面了)。app

部分來源:簡書[ALEXIRC]框架

相關文章
相關標籤/搜索