目錄
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可更加明晰其修飾的目標。
- CONSTRUCTOR:用於描述構造器
- FIELD:用於描述域
- LOCAL_VARIABLE:用於描述局部變量
- METHOD:用於描述方法
- PACKAGE:用於描述包
- PARAMETER:用於描述參數
- 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