1. 程式人生 > >二十一 JDK註解&註解案例

二十一 JDK註解&註解案例

default 修改 amp ann 生成幫助文檔 lib ont 幫助 ota

什麽是註解?

  • 註解和接口,類屬於同一個級別
  • 註解可以在變量、方法、類上加載
  • 註解可以有屬性也可以沒有屬性
  • 註解是有作用範圍(源碼、編譯期間,運行期間)
      • 源碼期間:例如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註解&註解案例