自定義註解

目錄

 

1註解

1.1作用

1.2 註解

1.3 內置註解

1.4 自定義註解

1.5 樣例——實現ORM框架映射


1註解

1.1作用

爲了簡化代碼,提高開發效率。

1.2 註解

jdk1.5新增新技術,註解。很多框架爲了簡化代碼,都會提供有些註解。可以理解爲插件,是代碼級別的插件,在類的方法上寫:@XXX,就是在代碼上插入了一個插件。註解不會也不能影響代碼的實際邏輯,僅僅起到輔助性的作用。

註解分類:內置註解(也成爲元註解 jdk 自帶註解)、自定義註解(Spring框架)

1.3 內置註解

 

1) @SuppressWarnings   再程序前面加上可以在javac編譯中去除警告--階段是SOURCE
(2) @Deprecated   帶有標記的包,方法,字段說明其過時----階段是SOURCE
(3)@Overricle   打上這個標記說明該方法是將父類的方法重寫--階段是SOURCE

@Overricle 案例演示

  @Override

    public String toString() {

         return null;

    }

 @ Deprecated案例演示

    new Date().parse("");

 

@ SuppressWarnings  案例演示

    @SuppressWarnings({ "all" })

    public void save() {

         java.util.List list = new ArrayList();

    }

1.4 自定義註解

元註解的作用就是負責註解其他註解。Java5.0定義了4個標準的meta-annotation類型,它們被用來提供對其它 annotation類型作說明。Java5.0定義的元註解:
1) @Target

@Target說明了Annotation所修飾的對象範圍:Annotation可被用於 packages、types(類、接口、枚舉、Annotation類型)、類型成員(方法、構造方法、成員變量、枚舉值)、方法參數和本地變量(如循環變量、catch參數)。在Annotation類型的聲明中使用了target可更加明晰其修飾的目標。

  1. CONSTRUCTOR:用於描述構造器
  2. FIELD:用於描述域
  3. LOCAL_VARIABLE:用於描述局部變量
  4. METHOD:用於描述方法
  5. PACKAGE:用於描述包
  6. PARAMETER:用於描述參數
  7. TYPE:用於描述類、接口(包括註解類型) 或enum聲明

2)@Retention

表示需要在什麼級別保存該註釋信息,用於描述註解的生命週期(即:被描述的註解在什麼範圍內有效).

1.RetentionPolicy.SOURCE —— 這種類型的Annotations只在源代碼級別保留,編譯時就會被忽略

2.RetentionPolicy.CLASS —— 這種類型的Annotations編譯時被保留,在class文件中存在,但JVM將會忽略

3.RetentionPolicy.RUNTIME —— 這種類型的Annotations將被JVM保留,所以他們能在運行時被JVM或其他使用反射機制的代碼所讀取和使用.
3) @Documented

Documented 註解表明這個註解應該被 javadoc工具記錄. 默認情況下,javadoc是不包括註解的. 但如果聲明註解時指定了 @Documented,則它會被 javadoc 之類的工具處理, 所以註解類型信息也會被包括在生成的文檔中.
4) @Inherited

這是一個稍微複雜的註解類型. 它指明被註解的類會自動繼承. 更具體地說,如果定義註解時使用了 @Inherited 標記,然後用定義的註解來標註另一個父類, 父類又有一個子類(subclass),則父類的所有屬性將被繼承到它的子類中. 深入瞭解註解詳情請參考這位大哥Java註解之Retention、Documented、Inherited介紹

1.5 樣例——實現ORM框架映射

實體類和表字段不一致時,根據建立實體類到底層sql語句的映射。

實現思路:其實就是使用Java反射機制獲取每個屬性上的註解value值,在拼接成數據庫的sql語句

//對應表的關聯註解
@Retention(RetentionPolicy.RUNTIME)
@interface Table{
    String value();
}
@Retention(RetentionPolicy.RUNTIME)
@interface Property{
    String name();
    int length() default 0;
}

@Table("tb_student")
@Data
class Student{
    @Property(name = "student_id",length = 10)
    private String studentId;
    @Property(name = "student_name")
    private String studentName;
    @Property(name = "student_name")
    private String studentAge;

}
public class Test001 {
    public static void main(String[] args) throws ClassNotFoundException {
        Class<?> forName = Class.forName("com.ilose.annotation.Student");
        //獲取所有當前的字段
        Field[] declaredFields = forName.getDeclaredFields();
        StringBuffer sb=new StringBuffer();
        sb.append(" select ");
        for (int i = 0; i < declaredFields.length; i++) {
            Field field = declaredFields[i];
            Property annotation = field.getDeclaredAnnotation(Property.class);
            sb.append(annotation.name());
            if(i<declaredFields.length-1){
                sb.append(" ,");
            }
        }
        //獲取類註解參數
        Table declaredAnnotation = forName.getDeclaredAnnotation(Table.class);
        sb.append( " from "+declaredAnnotation.value());
        System.out.println(sb.toString());
    }
}

輸出:
 select student_id ,student_name ,student_name from tb_student

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章