1. 程式人生 > >通過繼承來實現註解方式的屬性注入

通過繼承來實現註解方式的屬性注入

要使用註解來注入屬性,首先就要定義一個註解,註解的定義如下:

package everyworkdayprogramming._2015_1_23;

import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Inherited;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

/*四個元註解,他們的意思 (個人記憶)依次是 生成文件 可以被子類使用 在執行時可以使用 註解的目標是FIELD*/
@Documented
@Inherited
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
public @interface MyAnnotion {
	//有一個名為VALUE的值,預設為123
	String value() default "123";
}

package everyworkdayprogramming._2015_1_23;

import java.lang.reflect.Field;

public class SuperClass {
	// 在我們的父類的預設構造方法中來進行屬性注入的操作,這裡利用了子類會預設呼叫父類的無參構造方法的特性
	public SuperClass() {
		//獲得類中的所有的屬性
		Field[] fields = this.getClass().getDeclaredFields();
		//遍歷fields
		for (Field field : fields) {
			//如果這個field有註解MyAnnotion
			if (field.isAnnotationPresent(MyAnnotion.class)) {
				//獲得field對應的MyAnnotion例項
				MyAnnotion myAnnotion = field.getAnnotation(MyAnnotion.class);
				try {
					//因為field是私有屬性,所以要設定這裡
					field.setAccessible(true);
					//修改field的值為annotion中注入的值
					field.set(this, myAnnotion.value());
				} catch (IllegalArgumentException e) {
					e.printStackTrace();
				} catch (IllegalAccessException e) {
					e.printStackTrace();
				}
			}
		}
	}
}

package everyworkdayprogramming._2015_1_23;

/*子類直接繼承我們的父類*/
public class SubClass extends SuperClass {
	// 呼叫註解注入屬性,預設值是123,這裡設定為test
	@MyAnnotion(value = "test")
	private String num;

	public String getNum() {
		return num;
	}

	public void setNum(String num) {
		this.num = num;
	}

	public static void main(String[] args) {
		// 輸出一下我們的屬性值
		System.out.println(new SubClass().getNum());
	}
}