在上一章文章中記錄了學習的有關注解的基本知識點,對於含有參數的註解,沒有重點說明,這一篇就是專門記錄如何使用含有參數的註解。
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類中聲明的屬性信息。
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);
}
}
測試結果: