Java中自定義注解類,並加以運用


在Java框架中,經常會使用注解,而且還可以省很多事,來了解下自定義注解。

注解是一種能被添加到java代碼中的元數據,類、方法、變量、參數和包都可以用注解來修飾。注解對於它所修飾的代碼並沒有直接的影響

先寫一個自己的注解類

@Documented //會被javadoc命令識別
@Retention(RetentionPolicy.RUNTIME) //相當於作用時期,比如:運行期、編譯期
@Target({ElementType.METHOD}) //相當於作用域,比如方法、類
public @interface MyValue {

    String value();
    //也可以這么寫,就是說,它的默認值是hello
    //String value() default "hello";

}

然后解析上邊用到的那兩個類:

public enum RetentionPolicy {
	SOURCE,
	CLASS,
	RUNTIME
}
public enum ElementType {
    /** Class, interface (including annotation type), or enum declaration */
    TYPE,
    FIELD,
    METHOD,
    PARAMETER,
    CONSTRUCTOR,
    LOCAL_VARIABLE,
    ANNOTATION_TYPE,
    PACKAGE
}

可以看到,是兩個枚舉類,也就是我們自定義的注解有一定的時間和空間作用域。
好了,我們的自定義注解已經完成了(對的,自定義注解就上邊那一段代碼),那我們就來看看要怎么有用呢?很容易啊,就和其他的注解一樣,寫在我們要用到的地方就好了。(對的,我確定不是在開玩笑)

public class Person {
    
    @MyValue(value="張三")
    private String name;

    /*
    為什么要寫setter和getter,很快你就會知道
     */
    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

然后我們在其他地方去拿

Person person = new Person();
System.out.println(person.getName());//null

//這就很難受,按道理來說,不是應該是張三嗎?

大家都知道,像Spring這種框架都是通過反射來實現的,我們就模擬一個“編譯類”,我們是在屬性上用的注解,所以就先用反射來拿到類的所有屬性

public static void main(String[] args) throws NoSuchFieldException {
        Person person = new Person();

        //按理來說,我們是拿到這個Person.class的所有的屬性,然后遍歷,來挨個注入,但是這里我們明明確我們的屬性名,所以就簡單化了
        Field   field = Person.class.getDeclaredField("name");

        MyValue annotation = field.getAnnotation(MyValue.class);//拿到注解類

        String name = annotation.value();//這個value()就是我們在MyValue類中的的屬性

        //然后我們就注入到這個類中,這時就用到了setter方法
        person.setName(name);

        System.out.println("通過自定義注解后的person的name是:" + person.getName());
    }

是的,這樣我們就通過了自定義注解給Person注入了一個name屬性,但是在實際運用中不可能這么復雜,這只是入門了一下,我們可以將這個“模擬的編譯類”組裝成一個工具類,以便我們在實際中運用。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM