Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> Android學習之——(1)項目中的反射學習

Android學習之——(1)項目中的反射學習

編輯:關於Android編程

這周終於開始了公司項目的上手工作啦,接手了項目的兩個功能。大的框架,同事已經全部寫好了,需要做的就是往兩個功能裡填代碼就行了。不過本著強烈的學習精神,還是把全部的源代碼閱讀了一遍,項目功能雖然不是很大,但是涉及的東西還是相當多的。 首先,整個APP的布局,顯示效果采用的是牛逼哄哄的SlidingMenu來做的,這個的源代碼讀起來就太困難了,木有讀。不過當初前同事江哥就花了一個礼拜的時間閱讀完了,小弟佩服膜拜。服務器端采用WebService,因為是醫院項目,所以不涉及HTTP協議之類的,只需要在局域網內部署就可以了。數據庫采用公司傳統SQLServer。 這個項目的難點主要在服務端部分方法返回值提供的是DataTable類型的,由於Java好像木有Datatable,所以需要重寫服務端方法采用xml來返回數據。 還有就是在提交數據到數據庫時,有時候提交的也是Datatable,在android這邊需要將數據放到類中,類放到List中,List解析成xml格式,服務端需要將xml格式轉換成Datatable形式,聽起來還是蠻復雜的。
當然,上面這些問題同事已經大部分都完成了,我需要做的,就是講把需要操作的數據,穩妥的放到類中,類放到List中............ 嗯,進入正題,下面的內容就是將項目中我需要學習的知識整理出來,具體到應該會分為幾篇博文來記錄。

這篇主要是關於反射在項目中的一些用法,給羅列了出來。 關於反射可以參考這篇文章:http://blog.csdn.net/annaleeya/article/details/8240510 講解的真的是相當的到位。
一、利用反射確定是否關閉對話框
Field field;
/**
 * 利用反射確定是否關閉對話框
 * 
 * @param dialog
 * @param close
 *            false:不關閉;true:關閉
 */
public void closeDialog(final DialogInterface dialog, boolean close) {
    // 利用反射使點擊按鈕時,對話框不會關閉
    try {
        // 得到AlertDialog的父類屬性mShowing
        field = dialog.getClass().getSuperclass()
                .getDeclaredField("mShowing");
        field.setAccessible(true);
        // 將mShowing變量設為false,表示對話框已關閉
        field.set(dialog, close);
        dialog.dismiss();
    } catch (NoSuchFieldException e) {
        e.printStackTrace();
    } catch (IllegalArgumentException e) {
        e.printStackTrace();
    } catch (IllegalAccessException e) {
        e.printStackTrace();
    }
}
二、反射相關: a. 通過反射得到cla類的屬性列表
/**
 * 得到cla類的屬性列表
 * 
 * @param cla
 *            要反射的類
 * @return
 */
@SuppressWarnings("rawtypes")
public List getPropertyNames(Class cla) {
    List list = new ArrayList();
    Field[] fs = cla.getDeclaredFields();
    // fs=cla.getFields();加了這個的話就只獲得public 公有的
    for (Field f : fs) {
        list.add(f.getName());
    }
    return list;
}
b. 通過反射得到與屬性列表相對應的屬性值列表
/**
 * 得到與屬性列表相對應的屬性值列表
 * 
 * @param shuxingList
 *            屬性列表
 * @param obj
 *            實體類
 * @return 與屬性對應的屬性值列表
 * @throws NoSuchFieldException
 * @throws SecurityException
 * @throws IllegalAccessException
 * @throws IllegalArgumentException
 */
@SuppressWarnings({ "rawtypes", "unchecked" })
public List getValueList(List shuxingList, Object obj) {
    List valueList = null;
    try {
 
        Class cla = obj.getClass();
        valueList = new ArrayList();
        for (int i = 0; i < shuxingList.size(); i++) {
            Field f = cla.getDeclaredField(shuxingList.get(i).toString());
            f.setAccessible(true);// 加了這句才能改私有的值
            // 得到屬性值
            Object str = f.get(obj);
            valueList.add(str);
        }
    } catch (IllegalArgumentException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (NoSuchFieldException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (IllegalAccessException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    return valueList;
} 
c. 通過反射將obj類的屬性列表一個個賦值
/**
 * 將obj類的屬性列表一個個賦值
 * 
 * @param obj
 *            要反射的類
 * @param propertyNames
 *            類的屬性列表
 * @param propertyVales
 *            與屬性相對應的屬性值列表
 * @throws SecurityException
 * @throws NoSuchFieldException
 * @throws IllegalArgumentException
 * @throws IllegalAccessException
 */
@SuppressWarnings("rawtypes")
public void method(Object obj, List propertyNames,
        List propertyVales) {
    try {
        Class cla = obj.getClass();
        for (int i = 0, len = propertyNames.size(); i < len; i++) {
            // Log.i("propertyNames"+i, propertyNames.get(i)+"");
            Field f = cla.getDeclaredField(propertyNames.get(i).toString());
            f.setAccessible(true);// 加了這句才能改私有的值
            f.set(obj, propertyVales.get(i));
        }
    } catch (IllegalArgumentException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (NoSuchFieldException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (IllegalAccessException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
}
d. 通過反射得到字段名稱
public String[] GetFiled(Object object) {
    Class cla = object.getClass();
    Field[] fs = cla.getDeclaredFields();
    String[] fields = new String[fs.length];
    for (int i = 0; i < fs.length; i++) {
        // Log.i("propertyNames"+i, propertyNames.get(i)+"");
        fields[i] = fs[i].getName();
    }
    return fields;
 
}
e. 通過反射給obj類的單個屬性賦值
/**
 * 給obj類的單個屬性賦值
 * 
 * @param obj
 *            要反射的類
 * @param shuXing
 *            要賦值的屬性
 * @param value
 *            要給屬性賦予的值
 * @throws SecurityException
 * @throws NoSuchFieldException
 * @throws IllegalArgumentException
 * @throws IllegalAccessException
 */
public void method(Object obj, String shuXing, Object value)
        throws SecurityException, NoSuchFieldException,
        IllegalArgumentException, IllegalAccessException {
    @SuppressWarnings("rawtypes")
    Class cla = obj.getClass();
    Field f = cla.getDeclaredField(shuXing);
    // 加了這句才能改私有的值
    f.setAccessible(true);
    // 為屬性賦值
    f.set(obj, value);
}
f. 通過反射對類進行解析並賦值
/**
 * 對類解析並賦值
 * 
 * @param documentElement
 * @param object
 * @return
 * @throws NoSuchFieldException
 * @throws IllegalAccessException
 * @throws InstantiationException
 * @throws ClassNotFoundException
 */
public Object useFanSheToData(SoapObject documentElement, Object object,String entityname)
        throws NoSuchFieldException, IllegalAccessException,
        InstantiationException, ClassNotFoundException {
    // 利用反射給類賦值
    FanShe fanShe = new FanShe();
    // 存放類的屬性
    List classFileList = new ArrayList();
    // 存放類的屬性值
    List classValueList = new ArrayList();
    // 得到類反射類的屬性名稱
    Object obj = null;
    // 得到數據的key和value
    for (int i = 0; i < documentElement.getPropertyCount(); i++) {
 
        PropertyInfo propertyInfo = new PropertyInfo();
 
        documentElement.getPropertyInfo(i, propertyInfo);
 
        String propertyName = propertyInfo.getName();
        // System.out.println(propertyName);
        if (documentElement.getProperty(propertyName).toString()
                .startsWith("anyType")) {
            if (documentElement.getProperty(propertyName).toString()
                    .equals("anyType{}")) {
                classFileList.add(propertyName);
                classValueList.add("");
            } else {
                obj = useFanSheToData(
                        (SoapObject) documentElement
                                .getProperty(propertyName),
                        Class.forName(entityname + propertyName)
                                .newInstance(),entityname);
                classFileList.add(propertyName);
                classValueList.add(obj);
            }
        } else {
            classFileList.add(propertyName);
            classValueList.add(documentElement.getProperty(propertyName)
                    .toString());
        }
 
    }
    fanShe.method(object, classFileList, classValueList);
    return object;
}

Mr.傅:學習筆記
歡迎轉載,轉載注明出處,謝謝

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved