二十一 JDK註解&註解案例
什麽是註解?
- 註解和接口,類屬於同一個級別
- 註解可以在變量、方法、類上加載
- 註解可以有屬性也可以沒有屬性
- 註解是有作用範圍(源碼、編譯期間,運行期間)
-
- 源碼期間:例如String類上@Author @since , 使用javac命令將當前源碼生成幫助文件,可以識別String類上的註解
- 編譯期間:@Override 、@SuppressWarnings 、 @Deprecated,告訴編譯器部分信息
- 運行期間:@Test Junit會運行包含@Test註解的方法
-
@Test(timeout=1000) //單元測試,超過1ms則報異常
@Override //重寫父類的方法
@SuppressWarnings({ "rawtypes", "unused" }) //抑制編譯器警告,如果有變量未使用,未遵循泛型格式錯誤不報警告
@Deprecated //聲明一下方法過時,不建議使用
@Retention(RetentionPolicy.RUNTIME) //定義註解的時候,需要通過元註解說明當前自定義註解的作用,此註解在運行期間有效
@Target(ElementType.METHOD) //定義註解的時候,需要通過@Target說明目標對象
註解的作用:
- 編譯檢查
- 配置
- 生成幫助文檔
什麽時候用註解來做配置?
如果配置信息不會發生的修改,例如servlet
如果配置信息需要發生頻繁的修改,例如數據庫的用戶名和密碼信息,
建議采用傳統方法 (.txt , .properties , .xml)
自定義註解
格式:
-
public @interface 註解名稱{
//在註解中定義一個屬性
public 屬性類型 屬性名稱() default 默認值; -
public long timeout() default -1;
}
支持的類型:
註解支持的類型有:基本數據類型(4類8種),String,Class,Annotation,Enumeration,以及以上類型的一維數組類型
註解作用:配置
配置:開發的時候部分信息不希望寫死在程序中,例如數據庫的用戶名和密碼,可以將其存放在.txtr,properties,xml文件中
註解在後期的作用主要做配置
框架開發中,一般提供兩種方式:xml和註解
案例:模擬Junit
1 自定義註解@MyTest
通過元註解聲明作用域和目標對象,否則運行期間無法通過反射獲取到註解信息
2 定義UserDao,裏面有四個方法,加上註解
3 編寫測試類進行測試
將UserDao.class文件通過反射加載到內存
獲取到字節碼文件上的所有方法
判斷方法上是否有註解,如果有,則執行該方法。
MyTest
package com.test02; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; //定義註解的時候,需要通過元註解說明當前自定義註解的作用 //註解在運行期間有效 @Retention(RetentionPolicy.RUNTIME) //定義註解的時候,需要通過@Target說明目標對象 @Target(ElementType.METHOD) public @interface MyTest { //在MyTest註解中定義成員屬性,屬性為-1 public long timeout() default -1; }
UserDao
package com.test02; public class UserDao { static{ System.out.println("加載UserDao靜態代碼塊"); } @MyTest public void addUser(){ System.out.println("增加用戶"); } @MyTest public void delUser(){ System.out.println("刪除用戶"); } @MyTest public void uptUser(){ System.out.println("更新用戶"); } @MyTest public void getUser(){ System.out.println("得到用戶"); } }
測試類
package com.test02; import java.lang.reflect.Method; public class MyJunit { public static void main(String[] args) throws Exception { // 加載UserDao.class字節碼文件中的方法,判斷哪些方法上有自定義的註解@MyTest並執行 // 1 將UserDao.class字節碼文件加載到內存,class對象(字節碼文件在內存中的對象) Class clazz = Class.forName("com.test02.UserDao"); // 2 獲取字節碼對象上所有的方法,數組中的每一個元素都代表method對象(相當於字節碼中的每一個方法) Method[] methods = clazz.getMethods(); // 遍歷每個方法 for (Method method : methods) { // System.out.println(method.getName()); // 判斷方法上是否有@MyTest註解 // System.out.println(method.isAnnotationPresent(MyTest.class)); if (method.isAnnotationPresent(MyTest.class)) { // 如果有@MyTest註解,執行,否則忽略 method.invoke(new UserDao()); } } } }
二十一 JDK註解&註解案例