詳解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() {
    }
}

2、如果註解中有屬性,且沒有定義默認值,那麼在使用註解的時候,必須給屬性賦值。

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

但是註解中如果有默認值,在使用註解時,可以不給屬性賦值

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、枚舉

數組:

如果數組屬性中有一個元素,那麼數組的大括號可以省略:

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)標記一個註解隻能出現在類或者方法上

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

(2)標記一個註解可以被反射機制所讀取

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
 
// 標記註解隻能出現在類上
@Target(value = {ElementType.TYPE, ElementType.METHOD})
// 標記註解可以被反射機制所讀取
@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;
 
// 標記註解隻能出現在類上
@Target(value = {ElementType.TYPE, ElementType.METHOD})
// 標記註解可以被反射機制所讀取
@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());
        }
    }
}

(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;
 
// 標記註解隻能出現在類上
@Target(value = {ElementType.TYPE, ElementType.METHOD})
// 標記註解可以被反射機制所讀取
@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註解的使用的文章就介紹到這瞭,更多相關java註解內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!

推薦閱讀: