溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Java注解annotation簡單介紹

發(fā)布時間:2021-08-31 12:48:43 來源:億速云 閱讀:125 作者:chen 欄目:開發(fā)技術

這篇文章主要講解了“Java注解annotation簡單介紹”,文中的講解內(nèi)容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“Java注解annotation簡單介紹”吧!

目錄
  • Java注解(annotation)簡單上手

  • 1、什么是注解?

  • 2、java內(nèi)置注解

  • 3、注解的基本運


Java注解(annotation)簡單上手

反射reflect:http://www.kemok4.com/article/221282.htm

1、什么是注解?

注解就像商場的商品上都貼有自己的標簽一樣,它提供了關于這個商品的許多額外信息。你可以根據(jù)這些信息對其進行附加的處理。

“打上標簽” 以后,框架就可以利用Java的反射能力,掃描、獲取各Class/Method/Field上的注解,據(jù)此對其進行額外的處理。

2、java內(nèi)置注解

java中有一些java原生就定義的注解,像@Override

注解可以輔助反射機制,例如幫助我們快速篩選在反射中操作的目標,它在如今流行的框架中被大量使用

java內(nèi)置了一些注解,有些是輔助編譯器一起編譯時做驗證使用,下面兩個注解就是java內(nèi)置的注解,他們用于為我們定義的注解指定某些特性:

@Target
用于指定我們定義的注解可以被應用在哪里,具體的位置被枚舉類型ElementType定義,例如:
     TYPE:在類上可以使用當前注解,即只能標注在類上
     METHOD:在方法上可以使用當前注解,即只能標注在方法上
     FIELD:在屬性上可以使用當前注解,即只能標注在屬性上
     還有一些其他,可參見API手冊
@Retention
用于我們定義的注解的保留級別
      RetentionPolice.RUNTIME:最常用,保留在字節(jié)碼文件中且在該類運行時可被反射機制利用
      RetentionPolice.CLASS:保留在字節(jié)碼中,但是反射機制不可用,如若不寫默認@Retention就是該級別
      RetentionPolice.SOURCE:保留在源碼中

3、注解的基本運

創(chuàng)建注解

Java注解annotation簡單介紹

創(chuàng)建兩個注解類AutoRunClass和TestMethod

/*
    @Target()可以指定在哪使用這個注解
    這個表示是給類(Type)使用的注解,表示只能在類上使用,不能在其他地方使用
    @Target({ElementType.TYPE,ElementType.FIELD})也可以使用數(shù)組的方式使用多個
 */
@Target(ElementType.TYPE)
//保留級別
@Retention(RetentionPolicy.RUNTIME)

public @interface AutoRunClass {//這個注解的作用于篩選類
}
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface TestMethod {//這個注解的作用于篩選方法
    /*
        注解里可以定義參數(shù),格式:
        類型 參數(shù)名()
        注意:如果當前注解只有一個參數(shù)時,通常參數(shù)名叫value

        當我們定義了參數(shù),那么在使用當前注釋時需要為參數(shù)指定值,格式:
        @注解名(參數(shù)1=參數(shù)值1,參數(shù)1=參數(shù)值1,...)
        參數(shù)指定的順序可以與注解中定義的順序不一樣

        例如:
        @TestMethod(5)
        注:上述注解沒有指定參數(shù)名的原因是該注解只有一個參數(shù),并且參數(shù)名叫value
        即:int value();

        如果該參數(shù)定義時為:int sum();
        那么使用注解時要寫成:@TestMethod(sum=5)
        
        注:使用default可以初始化定義值
     */
    int value() default 1;
}

創(chuàng)建一個實體類Person,在其中使用注解標識類和方法

package reflect_text;

/**
 * 用于測試反射-注解機制
 */
@AutoRunClass//-----------------------
public class Person {
    private String name = "劉瑜澄";
    private int age = 22;

    public Person() {
    }

    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    //有了初始值,加不加參數(shù)都可以
    @TestMethod//-----------------------
    public void sayHi() {
        System.out.println(name + "Hi!!!");
    }

    @TestMethod(3)//-----------------------
    public void sayHello() {
        System.out.println(name + "大家好!");
    }

    @TestMethod(5)//-----------------------
    public void sayGoodBye() {
        System.out.println(name + "再見!");
    }

    public void say(String info) {
        System.out.println(name + ":" + info);
    }

    public void say(String info, int sum) {
        for (int i = 0; i < sum; i++) {
            System.out.println(name + ":" + info);
        }
    }

    @Override
    public String toString() {
        return "Person{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}

使用注解

要求判斷Person是否被AutoRunClass注解修飾,如果是則遍歷Person中所有方法,遍歷判斷這些方法是否被TestMethod注解修飾,是則根據(jù)注解傳入的參數(shù)去遍歷執(zhí)行該方法。

如果對反射不是很了解,可以看看http://www.kemok4.com/article/221282.htm

		//加載Person的類對象
        Class cls = Class.forName("reflect_text.Person");

        /*
            boolean isAnnotationPresent(Class annoCls)
            檢查是否又被annoCls指定的注解修飾
         */
        if (cls.isAnnotationPresent(AutoRunClass.class)) {
            System.out.println(cls.getName() + "被AutoRunClass注解修飾");
            //實例化
            Object obj = cls.newInstance();
            //掃描當前類定義的所有方法
            Method[] methods = cls.getDeclaredMethods();
            for (Method method : methods) {
                if (method.isAnnotationPresent(TestMethod.class)) {
                    System.out.println(method.getName()+"被TestMethod注解修飾");
                    //通過getAnnotation方法獲取method方法上的注解@TestMethod
                    TestMethod tm = method.getAnnotation(TestMethod.class);
                    //調(diào)用其參數(shù)名,獲取注解 參數(shù)value的值
                    int sum = tm.value();
                    //然后根據(jù)注解傳入的參數(shù)重復調(diào)用該方法
                    for (int i = 0; i < sum; i++) {
                        method.invoke(obj);
                    }
                }else{
                    System.out.println(method.getName() + "不被@TestMethod注解修飾");
                }
            }
        } else {
            System.out.println(cls.getName() + "沒有被AutoRunClass注解修飾");
        }

Java注解annotation簡單介紹

感謝各位的閱讀,以上就是“Java注解annotation簡單介紹”的內(nèi)容了,經(jīng)過本文的學習后,相信大家對Java注解annotation簡單介紹這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關知識點的文章,歡迎關注!

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI