//在寫程序的時候咱們可使用反射來使程序看起來更具備「靈性」,也就是可移植性比較強!反射就是可以讓程序員在程序運行的時候能夠獲取對象類型信息。
舉個簡單的列子:
import java.lang.reflect.Field;
public class Ref {
public static void main(String[] args) {
Persion p = new Persion();
Class c = p.getClass();
Field[] f = c.getDeclaredFields(); //返回 Field 對象的一個數組,這些對象反映此 Class 對象所表示的類或接口所聲明的全部字段, 這個是返回全部字段,包括私有屬性
for (int i=0; i<f.length; i++) {
System.out.println(f[i]);
}
}
}
class Persion {
public int id;
private String name;
}
打印結果:
public int Persion.id
private java.lang.String Persion.name
從打印結果咱們可以看出,這個Field中包含,類屬性的訪問修飾符,屬性類型,以及屬性名。同過這些咱們能夠很方便的來作咱們接下來要作的事情。寫一個通用的方法,來實現java對象到json對象的轉化,雖然有道json jar包已經有了這些功能,可是這不妨挨「重複製造輪子‘,這是一個學習的過程。
首先咱們的參數是Object,他能夠接受任何類型java
public static JSONObject changeJson(Object object) throws Exception {
JSONObject jb = new JSONObject(); //聲明json對象
Class c = object.getClass(); //獲取類的類型類
Field[] fields = c.getDeclaredFields(); //獲取屬性集合
Field.setAccessible(fields, true); //在類外面要想獲取私有屬性的值必須設置
Object[] name = new Object[fields.length]; //存儲變量名
Object[] value = new Object[fields.length]; //存儲變量值
Object[] type = new Object[fields.length]; //存儲變量類型
for (int i = 0; i < fields.length; i++) { //設置數組的值
name[i] = fields[i].getName();
value[i] = fields[i].get(object);
type[i] = fields[i].getType();
}
for (int i = 0; i < name.length; i++) {
String s1 = type[i].toString(); //變量類型
String v1 = value[i] + ""; //變量值
String n1 = name[i].toString(); //變量名
if (s1.contains("String")) {
if (!v1.equals("null")) {
jb.put(n1, v1); //給jsonobject設置key-value
}
} else if (s1.contains("long")) {
jb.put(n1, Integer.parseInt(v1));
} else if (s1.contains("int")) {
jb.put(n1, Integer.parseInt(v1));
}
}
return jb;
}
這個只是簡單的小例子,不過在作android開發的時候挺有用的。
源碼下載地址
android