通過繼承來實現註解方式的屬性注入
阿新 • • 發佈:2019-01-04
要使用註解來注入屬性,首先就要定義一個註解,註解的定義如下:
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()); } }