編程新手用反射註解獲取屬性值

原創:believe_today

作爲一個新手,很多時候都是壓根不知道代碼怎麼寫,沒有總體思路,有時候又是寫完一句,不知道下一局寫什麼了。下面我來講一講我作爲一個新手的編程過程吧

首先要準備3個類一個註解

1. 做第一個類 Dogbean

 

package Test.net.study;

public class DogBean {
    private String name;
    private  String sex;

    public String getName() {
        return name;
    }

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

    public String getSex() {
        return sex;
    }

    public void setSex(String sex) {
        this.sex = sex;
    }
}
2.第二個類  DogImpl

 

package Test.net.study;

public class DogImpl {
    @AutoWrite
    private DogBean dogBean;

    public DogBean getDogBean() {
        return this.dogBean;
    }
}
3.第三個,需要一個註解了

 

package Test.net.study;

import java.lang.annotation.*;
//註解需要表明清楚,整個編程才能運行,如果這裏沒有寫明註解,那麼你會運行出錯(這是我最初遇到的問題)
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
@Documented
public @interface AutoWrite {
}
4.這也是最後的一個BOSS了,所有的代碼都會集中在這裏了,讓我們來看看

 

package Test.net.study;

import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

public class TestCase {
    public static void main(String[] args) throws ClassNotFoundException, IllegalAccessException, InstantiationException, NoSuchMethodException, InvocationTargetException {
        //獲取項目包的位置
        String pkgName = TestCase.class.getPackage().getName();
        String classPath = ".DogImpl";
        //通過包名加類名獲取class(這裏用到線程的知識了)
        Class clazz = Thread.currentThread().getContextClassLoader().loadClass(pkgName+classPath);
        //通過class創建一個對象
        Object object = clazz.newInstance();
        //遍歷匿名類裏的所有的字段並執行
        for (Field field : clazz.getDeclaredFields()){
            //判斷字段是否爲空
            if (field.getAnnotation(AutoWrite.class) !=null){
                //獲取類中所有的字段方法
                Class fieldClass = field.getType();
                //創建一個對象
                Object fieldObject = fieldClass.newInstance();
                //遍歷匿名類裏的所有字段,並獲取值
                for (Field field1 : fieldClass.getDeclaredFields()) {
                    //讓第一個字母大寫(這是一個獲取字段首字母的句式,網上一搜就有了,不過還是要自己記住最好)
                    String fieldName = field1.getName();
                    fieldName = fieldName.substring(0, 1).toUpperCase() + fieldName.substring(1);
                    fieldName = "set" + fieldName;
                    //這裏開始賦值了
                    if(fieldName.equals("setName")){
                        //獲取方法對象
                        Method method = fieldClass.getMethod(fieldName, String.class);
                        method.invoke(fieldObject, "格格");
                    }
                    else if(fieldName.equals("setSex")){
                        Method method = fieldClass.getMethod(fieldName, String.class);
                        method.invoke(fieldObject, "");
                    }

                }
                //取消private等聲明的檢查,強制放入
                field.setAccessible(true);
                //第一個變量是需要塞東西的對象,第二個變量是需要塞進去的東西
                field.set(object,fieldObject);
            }
        }
        //強制轉換object對象
        DogImpl impl = (DogImpl) object;
        //打印輸出
        System.out.println(impl.getDogBean().getName());
        System.out.println(impl.getDogBean().getSex());
    }
}
要以上4個代碼都要OK沒錯了,那麼運行結果就是這樣的

 格格
 


Process finished with exit code 0


我這是第一次自己寫博客,喜歡大家能夠喜歡,多多關注我,我會努力每天都把自己每天所學到的,發到網上與大家一起學習討論,有什麼不好的地方歡迎大家能指出來。

最後,送大家一句話:

  越努力 ,越幸運

 美滋滋的說,哈哈~

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