Android之反射機制與JSON解析

1? ? ? 反射機制&JSON解析

Java的高級特性:反射機制

publicclass Student {

public String name;

private int age;

public Student() {

}

public Student(String name, int age) {

this.name = name;

this.age = age;

}

//靜態代碼塊,只在類被加載的時候執行一次

static{

System.out.println("Student類被加載......");

}

public void test(){

System.out.println(name+"...test...");

}

public void test(int num){

System.out.println(name+"...test..."+num);

}

public void test2(){

System.out.println(name+"..test2...");

}

@Override

public String toString() {

return "Student[name=" + name + ", age=" + age + "]";

}

}

publicclass ReflectDemo {

public static void main(String[] args)throws Exception {

// 第一次使用Student類,虛擬機會先加載這個類,生成對應的Class對象

Student stu = new Student();

// 第二次使用Student類,就會復用上一次加載過的類的Class對象

Student stu2 = new Student();

// 1、獲取Class對象

// 方式一:通過getClass方法

Class classzz =stu.getClass();

Class classzz2 =stu2.getClass();

System.out.println(classzz ==classzz2);? //返回true

//方式二:類名.class

Class classzz3 =Student.class;

System.out.println(classzz ==classzz3);? //返回true

//方式三:通過Class.forName()方法

Class classzz4 =Class.forName("bo.Student");

System.out.println(classzz ==classzz4);?? //返回true

//2、獲取類名

//String className =classzz.getName();

String className =stu.getClass().getName();

System.out.println("類名:"+className);?????? //返回類名:bo.Student

//3、獲取構造方法

//獲取無參構造器

Constructor c1 =classzz.getConstructor();

//獲取帶參構造方法

Constructor c2 =classzz.getConstructor(String.class,int.class);

//通過構造器創建并初始化對象

//Student stu3 = (Student)c1.newInstance();

Student stu3 =(Student)c2.newInstance("小強",18);

System.out.println("stu3"+stu3);????????? //stu3Student [name=小強, age=18]

//classzz.getConstructors();

//classzz.getDeclaredClasses();

//4、獲取成員字段

//獲取類中public修飾的成員字段

Field field =classzz.getField("name");

// 獲取類中已聲明過的所有成員字段(包括私有的)

Field field2 =classzz.getDeclaredField("age");

// 暴利訪問

field2.setAccessible(true);

// 設置某個指定對象的字段的值

field.set(stu3, "如花");

field2.set(stu3, 30);

System.out.println("stu3= " + stu3);

// clazz.getFields();

// clazz.getDeclaredFields();

// 5、獲取成員方法

// 獲取無參的方法

Method method =classzz.getMethod("test");

// 獲取帶參的方法

Method method2 =classzz.getMethod("test", int.class);

// Method method3 =clazz.getDeclaredMethod(name, parameterTypes)

//method3.setAccessible(true);

// 執行方法

method.invoke(stu3);

Student stu4 = newStudent("旺財",99);

method2.invoke(stu4, 666);

// clazz.getMethods();

//clazz.getDeclaredMethods();

}

}

1.1????JSON

Stage1【

public class Tester {

public static void main(String[] args){

//要生成JSON字符串,使用無參構造方法創建JSONObject

JSONObject jo = newJSONObject();

try {//將屬性名name,屬性值Tom放進JSONObject

jo.put("name","Tom");

//將屬性名age,屬性值21放進JSONObject

jo.put("age",21);

//根據put進去的屬性名和屬性值生成JSON字符串

String str =jo.toString();

System.out.println(str);

} catch (JSONException e) {

// TODOAuto-generated catch block

e.printStackTrace();

}

}

}

《生成:{"age":21,"name":"Tom"}》

public static void main(String[] args){

try {

JSONObject jo = newJSONObject("{'age':21,'name':'Tom'}");

//???????????????????????? String name =(String)jo.get("name");//取出屬性名為name的屬性值

String name =jo.getString("name");//這個方法更方便,不用強轉

//???????????????????????? int age =(Integer)jo.get("age");? //取出屬性名為age的屬性值

int age = jo.getInt("age");??????? //這個方法更方便

System.out.println(name);

System.out.println(age);

} catch (JSONException e) {

// TODOAuto-generated catch block

e.printStackTrace();

}

}

public static voidmain(String[] args) {

//要生成JSON字符串,使用無參構造方法創建JSONObject

JSONObject jo = newJSONObject();

try {//將屬性名name,屬性值Tom放進JSONObject

jo.put("name","Tom");

//將屬性名age,屬性值21放進JSONObject

jo.put("age",21);

//根據put進去的屬性名和屬性值生成JSON字符串

String str =jo.toString();

System.out.println(str);

} catch (JSONException e) {

// TODOAuto-generated catch block

e.printStackTrace();

}

}

《生成:["1000phone","java","Android","iOS"]》

//要解析就用單參數構造方法創建JSONArray,參數就是要解析的JSON字符串,創建完就解決好了,放進JSONArray中

JSONArray ja = newJSONArray("['1000phone','java','android','ios']");

for(inti=0;i

System.out.println(ja.get(i));

}

public static void main(String[] args){

//這個JSONArray不再放簡單的字符串,要放JSONObject

try {

JSONArray ja = newJSONArray();

//構建第一個JSONObject

JSONObject jo1 = newJSONObject();

jo1.put("name","zhangsan");

jo1.put("age",21);

ja.put(jo1);//把構建的第一個JSONObject放進JSONArray

//構建第二個JSONObject

JSONObject jo2 = newJSONObject();

jo2.put("name","lisi");

jo2.put("age",25);

ja.put(jo2);//把構建的第二個JSONObject放進JSONArray

//構建第三個JSONObject

JSONObject jo3 = newJSONObject();

jo3.put("name","wangwu");

jo3.put("age",20);

ja.put(jo3);//把構建的第三個JSonObject放進JSONArray

String str =ja.toString();//生成表示數組的JSON字符串,元素是JSON對象

System.out.println(str);

} catch (JSONException e) {

// TODOAuto-generated catch block

e.printStackTrace();

}

}

《生成:[{"age":21,"name":"zhangsan"},{"age":25,"name":"lisi"},{"age":20,"name":"wangwu"}]》

public static void main(String[] args){

try {//解析表示數組的JSON字符串,在構建JSONArray時完成解析

JSONArray ja = newJSONArray("[{'age':20,'name':'zhangsan'},"

+"{'age':25,'name':'lisi'},{'age':20,'name':'wangwu'}]");

for(inti=0;i

JSONObjectjo = ja.getJSONObject(i);//取出每個JSONObject元素

String name= jo.getString("name");//取出這個元素JSONObject的屬性值

int age =jo.getInt("age");

System.out.println(name+"?? "+age);

}

} catch (Exception e) {

// TODO: handleexception

}

}

public class Student{

private String name;

private int age;

public Student(String name, int age) {

this.name = name;

this.age = age;

}

public String getName() {

return name;

}

public void setName(String name) {

this.name = name;

}

public int getAge() {

return age;

}

public void setAge(int age) {

this.age = age;

}

@Override

public String toString() {

return "Student[name=" + name + ", age=" + age + "]";

}

}

public class Practice{

public static void main(String[] args){

List list =new ArrayList();

list.add(newStudent("Tom", 23));

list.add(newStudent("Jerray", 24));

list.add(newStudent("Mike", 22));

//1.用這個list生成一個JSON字符串

try {

JSONArray ja = newJSONArray(); //創建JSONArray

for(Studentstudent:list){//遍歷list中的Student對象

JSONObjectjo = new JSONObject();//每次遍歷創建一個JSONObject

jo.put("name",student.getName());//將名字放入JSONObject,,屬性名為name,值為學生名字

jo.put("age",student.getAge());//將年齡放入JSONObject

ja.put(jo);//將初始化好了的JSONObject放進JSONArray

}

Stringstr= ja.toString();

System.out.println(str);

//2.解析1中的字符串,生成一個響應的ArrayList存放JSON字符串中的信息

//創建時就解析了這個字符串,把解析出來的信息放進JSONArray對象

JSONArray? ja2 = new JSONArray(str);

//這是網絡另一頭的一個list,要把解析出來的信息放進去

Listlist2 = new ArrayList();

for(inti=0;i

JSONObjectjo = ja2.getJSONObject(i);//每次都拿出一個JSONObject

String name= jo.getString("name");//從這個JSONObject中拿出名字屬性的值

int age =jo.getInt("age");//從這個JSONObject中拿出年齡屬性的值

Student s =new Student(name, age);//用解析出來的兩個屬性信息構建一個Student對象

list2.add(s);//把這個Student對象放進list

}

for(Students:list2){//驗證

System.out.println(s);

}

} catch (Exception e) {

// TODO: handleexception

}

}

}

《生成:[{"age":23,"name":"Tom"},{"age":24,"name":"Jerray"},{"age":22,"name":"Mike"}]

Student [name=Tom, age=23]

Student [name=Jerray, age=24]

Student [name=Mike, age=22]

1.2????Gson

Stage1【

public static voidmain(String[] args) {

Student student = newStudent("Tom", 21);//要生成為json字符串對象

//先用無參構造方法創建Gson對象

Gson gson = new Gson();

//用toJson直接生成表示這個student對象的json字符串

String str =gson.toJson(student);??? //將對象直接轉換成json字符串

System.out.println(str);

}

《生成:{"name":"Tom","age":21}》

public static voidmain(String[] args) {

String str="{'name':'Tom','age':21}";//要解析的表示對象的字符串

Gson gson = new Gson();//創建Gson對象

//解析fromJson,第一個參數是要解析的字符串,第二個參數是解析出來的對象類型,是一個描述類對象

Student student =gson.fromJson(str, Student.class);

//?????????????? gson.fromJson(str,Class.forName("com.xys.json.Student"));

System.out.println(student);

}

《封裝類:Student同上

生成:Student [name=Tom, age=21]

public class Tester3{

public static void main(String[] args){

List list = newArrayList();

list.add(new Student("tom", 22));

list.add(new Student("jerry", 23));

list.add(new Student("jone",20));

Gson gson = new Gson();

String str = gson.toJson(list);

System.out.println(str);

}

}

《生成:[{"name":"tom","age":22},{"name":"jerry","age":23},{"name":"jone","age":20}]》

//要解析的字符串

String str ="[{'name':'jerray','age':23},{'name':'jone','age':20}]";

Gson gson = new Gson();

//第一個參數是要解析的字符串,第二個,TypeToken將ArrayList本身的類型和范型類型都封裝了進去,

//再使用getType類型作為第二個參數

ArrayList list= gson.fromJson(str,

newTypeToken>() {

}.getType());

for (Student student : list){

System.out.println(student);

}

}

《輸出:Student[name=jerray, age=23]

Student [name=jone,age=20]》

反射? 可以讓程序在運行時"看到自己"

Class 描述類的類,或描述類

static Class forName(String className)可以通過參數中的字符串形式的類的全名來獲取這個類的描述類對象

newInstance()用描述類對象創建一個所描述的類的實例,這種方式比起new 類名()更靈活

可以通過描述類對象的Method[] getDeclaredMethods()獲取所有聲明的方法(方法描述類對象)

可以通過描述類對象的Field[] getDeclaredFields()獲取所有聲明的屬性

Method getMethod(String name,Class[]paramTypes)可以獲取指定名字、指定參數類型的方法描述對象

Method 描述方法的類

getName()獲取方法名

invoke(Object obj,Object[] params)調用方法,第一個參數為調用方法的對象,第二個參數為傳入的參數

1.3????JSON javascript object notation

是一種和語言、平臺無關的通信格式

表示對象:{屬性名:屬性值,屬性名2:屬性值......}用一對大括號表示對象的邊界,其中可以有多個屬性,用逗號隔開,屬性名和屬性值用冒號隔開,這么一個字符串就是表示對象的JSON字符串

表示數組:[元素1,元素2,元素3.......]用一對中括號表示數組邊界,其中可以有多個元素,用逗號隔開,這些元素可以是字符串,也可以是JSON對象

JSONObject類,生成和解析JSON對象字符串都是用這個類

1、生成表示對象的JSON字符串,用無參構造方法創建JSONObject實例,然后使用put方法將屬性名和屬性值添加進去,全部放進去后,使用toString()生成表示對象的JSON字符串

2、解析表示對象的JSON字符串,用單參構造方法JSONObject(Stringstr)來創建實例,參數就是要解析的字符串,實例創建時會自動將字符串中的對象屬性名和屬性值加入到JSONObject實例中,再通過get方法把屬性名對應的屬性值取出來

JSONArray類,生成和解析表示數組的JSON字符串

3、生成表示數組的JSON字符串,先用無參構造方法創建JSONArray實例,再調用put方法把數組元素放進去,最后用toString()生成這個表示數組的字符串

4、解析表示數組的JSON字符串,先用單參構造方法創建JSONArray實例,傳入的String參數就是要解析的字符串,實例構建完,解析就已經完成,接下來就把這個元素從里面拿出來,使用get(int index)獲取指定下標的元素(從0到n-1),可以使用length()獲取所包含的數組長度

如果元素是JSONObject,可使用getJSONObject(int index)

Gson 谷歌的json生成、解析框架

Gson類,通過無參構造方法創建

toJson()生成json字符串

fromJson()解析json字符串

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,606評論 6 533
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,582評論 3 418
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,540評論 0 376
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,028評論 1 314
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,801評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,223評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,294評論 3 442
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,442評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,976評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,800評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,996評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,543評論 5 360
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,233評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,662評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,926評論 1 286
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,702評論 3 392
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,991評論 2 374

推薦閱讀更多精彩內容

  • 轉載:http://www.lxweimin.com/p/b87fee2f7a23 前言 今天,我們來介紹現今主流的...
    朝花夕拾不起來閱讀 3,237評論 2 27
  • 1. Java基礎部分 基礎部分的順序:基本語法,類相關的語法,內部類的語法,繼承相關的語法,異常的語法,線程的語...
    子非魚_t_閱讀 31,721評論 18 399
  • 1 XML解析No29 【 XML:可拓展標記語言,語言和HTML類似,也是一種標記語言。 特點:標記是自定義...
    征程_Journey閱讀 1,666評論 0 9
  • 夜深,再沒有眼前的繁華可以麻痹這個無助的靈魂。把心掏出來,一點一點切碎,和著滾燙的血、苦澀的淚,獨自咀嚼咽下,在無...
    朝話夕食閱讀 291評論 0 0
  • 許衡領著他的學生奔波于戰亂之途,路經一梨園,學生迫于饑渴,紛紛摘梨。許衡端坐園側巋然不動。學生說:園為無主之園...
    徐謐浮水流燈閱讀 436評論 0 3