java註解(學習二)


在上一章文章中記錄了學習的有關注解的基本知識點,對於含有參數的註解,沒有重點說明,這一篇就是專門記錄如何使用含有參數的註解。

1、自定義含有參數的註解

首先通過元註解自定義一個註解,爲@CarProvider註解指定可以註解類的變量(範圍),並且可以運行在JVM中。該註解聲明瞭三個屬性,並且都有默認值。

@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface CarProvider {
    public String name() default "寶馬";
    public float price() default 100000;
    public String provider() default "德國";
}

之後可以使用該註解,註解一個類的變量,如下

//使用註解
public class Car {
	//爲變量註解
    @CarProvider(name = "本田",price = 200000,provider = "日本")
    private String carProvider;

    public String getCarProvider() {
        return carProvider;
    }
    public void setCarProvider(String carProvider) {
        this.carProvider = carProvider;
    }
}

2、java反射機制

在解析上面自定義的註解之前,先了解基本的java反射機制。Java 反射機制是指在運行狀態中,對於任意一個類都能夠知道這個類所有的屬性和方法;並且對於任意一個對象,都能夠調用它的任意一個方法;這種動態獲取信息以及動態調用對象方 法的功能成爲Java 語言的反射機制。因此,可以通過反射機制得到註解信息。
如下代碼,先看一下簡單的反射的例子,得到一個類的屬性的信息。

public class A {
    private int age;
    private String name;
    public Boolean sex;
    public A() {
    }
    public A(int age, String name) {
        this.age = age;
        this.name = name;
    }
    public int getAge() {
        return age;
    }
    @Deprecated
    public int getAge1() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
}

如何得到A類中屬性的信息呢?

public class Test {
    public static void main(String[] args){
        Class c1 = A.class;
        //使用getDeclaredFields()可以得到A類的屬性信息,並打印
        Field[] fs = c1.getDeclaredFields();
        for(int i = 0; i < fs.length; i++){
            System.out.println("成員變量名稱:" + fs[i].getName());
        }

打印結果如下:即A類中聲明的屬性信息。
圖1

3、解析註解

如果對於註解沒有任何處理和解釋的話,這樣的註解和註釋相比,沒有什麼用處,因此要創建一個類進行處理註解,這裏就要用到第2節談到的java反射機制。

//解析註解類,主要使用的反射機制。
public class CarInfoUtil {
    //Class對象作爲參數
    public static void getCarInfo(Class<?> clazz){
        String carInfo = "";
        Field[] fields = clazz.getDeclaredFields();

        for( Field fd : fields){
        	//判斷該屬性上是否含有指定的註解,如果有返回true,否則false
            if(fd.isAnnotationPresent(CarProvider.class)){
               //得到該屬性的註解的信息
                CarProvider carProvider = (CarProvider) fd.getAnnotation(CarProvider.class);

                //打印信息
                carInfo = "車的名稱:"+ carProvider.name()+ ";"+ 
               			  "車的價格:" + carProvider.price()+ ";"+  
                          "車的提供商:"+ carProvider.provider();
                System.out.println(carInfo);
            }
        }
    }

4、測試結果

//測試註解
public class ReflexTest {
    public static void main(String[] args) {
        CarInfoUtil.getCarInfo(Car.class);
    }
}

測試結果:
圖2

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章