溫馨提示×

溫馨提示×

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

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

java中注解的示例分析

發(fā)布時間:2021-06-25 15:54:11 來源:億速云 閱讀:162 作者:小新 欄目:開發(fā)技術(shù)

這篇文章將為大家詳細(xì)講解有關(guān)java中注解的示例分析,小編覺得挺實用的,因此分享給大家做個參考,希望大家閱讀完這篇文章后可以有所收獲。

定義

 1、如果注解中有屬性,那么必須給屬性賦值。

package com.lxc.Test;
 
// 定義一個注解
public @interface Annotation {
    String name(); // 看似name像一個方法,實際上我們把name稱為屬性
}

使用上邊注解:

package com.lxc.Test;
 
public class Test {
    @Annotation(name="lxc")
    public void test() {
    }
}

java中注解的示例分析

2、如果注解中有屬性,且沒有定義默認(rèn)值,那么在使用注解的時候,必須給屬性賦值。

public @interface Annotation {
    String name();
    int age();
}
public class Test {
    @Annotation(name="lxc", age=20)
    public void test() {
    }
}

但是注解中如果有默認(rèn)值,在使用注解時,可以不給屬性賦值

public class Test {
    @Annotation(name="lxc")
    public void test() {
    }
}
public @interface Annotation {
    String name();
    String password() default "123";
}

3、value() 屬性

如果注解中的一個屬性名是value,且有且只有一個value(),在使用注解的時候,屬性名可以省略

public class Test {
    @Annotation("lxc")
    public void test() {
    }
}
public @interface Annotation {
    String value();
    String password() default "123";
}

注解中屬性的類型有哪些

byte、short、int、float、double、boolean、char、String、Class、枚舉

數(shù)組:

如果數(shù)組屬性中有一個元素,那么數(shù)組的大括號可以省略:

public @interface Annotation {
    String[] name();
}
public class Test {
    // @Annotation(name={"lxc"}) // 寫法一
    @Annotation(name="lxc") // 寫法二
    public void test() {
    }
}

枚舉:

public enum MyEnum {
    className, name, age,
}
public @interface Annotation {
    String[] name();
    MyEnum[] student();
}
public class Test {
    @Annotation(name="lxc", student = {MyEnum.className, MyEnum.age})
    public void test() {
    }
}

注解如何使用:

(1)標(biāo)記一個注解只能出現(xiàn)在類或者方法上

@Target(value = {ElementType.TYPE, ElementType.METHOD})
public @interface Annotation {
    String userName();
    MyEnum[] student();
}

(2)標(biāo)記一個注解可以被反射機制所讀取

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
 
// 標(biāo)記注解只能出現(xiàn)在類上
@Target(value = {ElementType.TYPE, ElementType.METHOD})
// 標(biāo)記注解可以被反射機制所讀取
@Retention(RetentionPolicy.RUNTIME)
public @interface Annotation {
    String userName();
    MyEnum[] student();
}

獲取注解中的屬性值

通過反射機制來獲取。

(1)獲取類上邊注解的屬性:

注解類:

package com.lxc.Test;
 
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
 
// 標(biāo)記注解只能出現(xiàn)在類上
@Target(value = {ElementType.TYPE, ElementType.METHOD})
// 標(biāo)記注解可以被反射機制所讀取
@Retention(RetentionPolicy.RUNTIME)
public @interface Annotation {
    String userName() default "呂星辰";
}

使用注解類:

// myAnnotation 
@Annotation(userName = "哈哈")
public class myAnnotation {
}

獲取注解類中 的屬性:

package com.lxc.Test;
/**
 * c.isAnnotationPresent(注解類.class) : 判斷一個類上是否有注解,返回true、false
 * c.getAnnotation(注解類.class) : 獲取注解類的實例
 *
 */
public class Test {
    public static void main(String[] args) throws Exception{
        Class c = Class.forName("com.lxc.Test.myAnnotation");
        System.out.println(c.isAnnotationPresent(Annotation.class));
        // 判斷一個類是否有:Annotation這個注解
        if(c.isAnnotationPresent(Annotation.class)) {
            // 獲取注解對象
            Annotation ann = (Annotation) c.getAnnotation(Annotation.class);
            // 通過注解對象獲取屬性值
            System.out.println(ann.userName());
        }
    }
}

java中注解的示例分析

(2)獲取類中方法上邊注解的屬性:

注解類:

package com.lxc.Test;
 
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
 
// 標(biāo)記注解只能出現(xiàn)在類上
@Target(value = {ElementType.TYPE, ElementType.METHOD})
// 標(biāo)記注解可以被反射機制所讀取
@Retention(RetentionPolicy.RUNTIME)
public @interface Annotation {
    String userName();
    String password();
}

在方法上使用注解及獲取方法上邊的注解:
分析:想獲取方法上的注解,首先需要獲取該方法,獲取該方法的前提,獲取該方法的類:

package com.lxc.Test;
 
import java.lang.reflect.Method;
 
public class UserAnnotation {
    @Annotation(userName = "lxc", password = "123")
    public void getUser() {}
 
    public static void main(String[] args) throws Exception{
        // 通過反射獲取類
        Class c = Class.forName("com.lxc.Test.UserAnnotation");
        // 通過反射獲取類中的方法
        Method getUserMethod = c.getDeclaredMethod("getUser");
        // 判斷方法是否有 Annotation 這個注解
        if(getUserMethod.isAnnotationPresent(Annotation.class)) {
            Annotation ann = getUserMethod.getAnnotation(Annotation.class);
            System.out.println(ann.userName()); // lxc
            System.out.println(ann.password()); // 123
        }
    }
}

java中注解的示例分析

關(guān)于“java中注解的示例分析”這篇文章就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,使各位可以學(xué)到更多知識,如果覺得文章不錯,請把它分享出去讓更多的人看到。

向AI問一下細(xì)節(jié)

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

AI