Android之反射機(jī)制與JSON解析

1? ? ? 反射機(jī)制&JSON解析

Java的高級特性:反射機(jī)制

publicclass Student {

public String name;

private int age;

public Student() {

}

public Student(String name, int age) {

this.name = name;

this.age = age;

}

//靜態(tài)代碼塊导俘,只在類被加載的時候執(zhí)行一次

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類渠概,虛擬機(jī)會先加載這個類,生成對應(yīng)的Class對象

Student stu = new Student();

// 第二次使用Student類馍佑,就會復(fù)用上一次加載過的類的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堤器、獲取構(gòu)造方法

//獲取無參構(gòu)造器

Constructor c1 =classzz.getConstructor();

//獲取帶參構(gòu)造方法

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

//通過構(gòu)造器創(chuàng)建并初始化對象

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

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

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

//classzz.getConstructors();

//classzz.getDeclaredClasses();

//4、獲取成員字段

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

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

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

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

// 暴利訪問

field2.setAccessible(true);

// 設(shè)置某個指定對象的字段的值

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);

// 執(zhí)行方法

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字符串,使用無參構(gòu)造方法創(chuàng)建JSONObject

JSONObject jo = newJSONObject();

try {//將屬性名name,屬性值Tom放進(jìn)JSONObject

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

//將屬性名age,屬性值21放進(jìn)JSONObject

jo.put("age",21);

//根據(jù)put進(jìn)去的屬性名和屬性值生成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");//這個方法更方便,不用強(qiáng)轉(zhuǎn)

//???????????????????????? 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字符串疹鳄,使用無參構(gòu)造方法創(chuàng)建JSONObject

JSONObject jo = newJSONObject();

try {//將屬性名name,屬性值Tom放進(jìn)JSONObject

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

//將屬性名age,屬性值21放進(jìn)JSONObject

jo.put("age",21);

//根據(jù)put進(jìn)去的屬性名和屬性值生成JSON字符串

String str =jo.toString();

System.out.println(str);

} catch (JSONException e) {

// TODOAuto-generated catch block

e.printStackTrace();

}

}

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

//要解析就用單參數(shù)構(gòu)造方法創(chuàng)建JSONArray,參數(shù)就是要解析的JSON字符串拧略,創(chuàng)建完就解決好了,放進(jìn)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();

//構(gòu)建第一個JSONObject

JSONObject jo1 = newJSONObject();

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

jo1.put("age",21);

ja.put(jo1);//把構(gòu)建的第一個JSONObject放進(jìn)JSONArray

//構(gòu)建第二個JSONObject

JSONObject jo2 = newJSONObject();

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

jo2.put("age",25);

ja.put(jo2);//把構(gòu)建的第二個JSONObject放進(jìn)JSONArray

//構(gòu)建第三個JSONObject

JSONObject jo3 = newJSONObject();

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

jo3.put("age",20);

ja.put(jo3);//把構(gòu)建的第三個JSonObject放進(jìn)JSONArray

String str =ja.toString();//生成表示數(shù)組的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 {//解析表示數(shù)組的JSON字符串,在構(gòu)建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(); //創(chuàng)建JSONArray

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

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

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

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

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

}

Stringstr= ja.toString();

System.out.println(str);

//2.解析1中的字符串月褥,生成一個響應(yīng)的ArrayList存放JSON字符串中的信息

//創(chuàng)建時就解析了這個字符串,把解析出來的信息放進(jìn)JSONArray對象

JSONArray? ja2 = new JSONArray(str);

//這是網(wǎng)絡(luò)另一頭的一個list,要把解析出來的信息放進(jìn)去

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);//用解析出來的兩個屬性信息構(gòu)建一個Student對象

list2.add(s);//把這個Student對象放進(jìn)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字符串對象

//先用無參構(gòu)造方法創(chuàng)建Gson對象

Gson gson = new Gson();

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

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

System.out.println(str);

}

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

public static voidmain(String[] args) {

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

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

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

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();

//第一個參數(shù)是要解析的字符串舀透,第二個栓票,TypeToken將ArrayList本身的類型和范型類型都封裝了進(jìn)去,

//再使用getType類型作為第二個參數(shù)

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)可以通過參數(shù)中的字符串形式的類的全名來獲取這個類的描述類對象

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

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

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

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

Method 描述方法的類

getName()獲取方法名

invoke(Object obj,Object[] params)調(diào)用方法坠狡,第一個參數(shù)為調(diào)用方法的對象,第二個參數(shù)為傳入的參數(shù)

1.3????JSON javascript object notation

是一種和語言遂跟、平臺無關(guān)的通信格式

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

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

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

1富拗、生成表示對象的JSON字符串,用無參構(gòu)造方法創(chuàng)建JSONObject實例鸣戴,然后使用put方法將屬性名和屬性值添加進(jìn)去啃沪,全部放進(jìn)去后,使用toString()生成表示對象的JSON字符串

2葵擎、解析表示對象的JSON字符串谅阿,用單參構(gòu)造方法JSONObject(Stringstr)來創(chuàng)建實例,參數(shù)就是要解析的字符串,實例創(chuàng)建時會自動將字符串中的對象屬性名和屬性值加入到JSONObject實例中签餐,再通過get方法把屬性名對應(yīng)的屬性值取出來

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

3寓涨、生成表示數(shù)組的JSON字符串,先用無參構(gòu)造方法創(chuàng)建JSONArray實例氯檐,再調(diào)用put方法把數(shù)組元素放進(jìn)去戒良,最后用toString()生成這個表示數(shù)組的字符串

4、解析表示數(shù)組的JSON字符串冠摄,先用單參構(gòu)造方法創(chuàng)建JSONArray實例糯崎,傳入的String參數(shù)就是要解析的字符串,實例構(gòu)建完河泳,解析就已經(jīng)完成沃呢,接下來就把這個元素從里面拿出來,使用get(int index)獲取指定下標(biāo)的元素(從0到n-1),可以使用length()獲取所包含的數(shù)組長度

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

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

Gson類,通過無參構(gòu)造方法創(chuàng)建

toJson()生成json字符串

fromJson()解析json字符串

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末纸兔,一起剝皮案震驚了整個濱河市惰瓜,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌汉矿,老刑警劉巖崎坊,帶你破解...
    沈念sama閱讀 206,839評論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異洲拇,居然都是意外死亡奈揍,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,543評論 2 382
  • 文/潘曉璐 我一進(jìn)店門呻待,熙熙樓的掌柜王于貴愁眉苦臉地迎上來打月,“玉大人,你說我怎么就攤上這事蚕捉∽喔荩” “怎么了?”我有些...
    開封第一講書人閱讀 153,116評論 0 344
  • 文/不壞的土叔 我叫張陵迫淹,是天一觀的道長秘通。 經(jīng)常有香客問我,道長敛熬,這世上最難降的妖魔是什么肺稀? 我笑而不...
    開封第一講書人閱讀 55,371評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮应民,結(jié)果婚禮上话原,老公的妹妹穿的比我還像新娘夕吻。我一直安慰自己,他們只是感情好繁仁,可當(dāng)我...
    茶點故事閱讀 64,384評論 5 374
  • 文/花漫 我一把揭開白布涉馅。 她就那樣靜靜地躺著,像睡著了一般黄虱。 火紅的嫁衣襯著肌膚如雪稚矿。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,111評論 1 285
  • 那天捻浦,我揣著相機(jī)與錄音晤揣,去河邊找鬼。 笑死朱灿,一個胖子當(dāng)著我的面吹牛昧识,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播盗扒,決...
    沈念sama閱讀 38,416評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼滞诺,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了环疼?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,053評論 0 259
  • 序言:老撾萬榮一對情侶失蹤朵耕,失蹤者是張志新(化名)和其女友劉穎炫隶,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體阎曹,經(jīng)...
    沈念sama閱讀 43,558評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡伪阶,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,007評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了处嫌。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片栅贴。...
    茶點故事閱讀 38,117評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖熏迹,靈堂內(nèi)的尸體忽然破棺而出檐薯,到底是詐尸還是另有隱情,我是刑警寧澤注暗,帶...
    沈念sama閱讀 33,756評論 4 324
  • 正文 年R本政府宣布坛缕,位于F島的核電站,受9級特大地震影響捆昏,放射性物質(zhì)發(fā)生泄漏赚楚。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,324評論 3 307
  • 文/蒙蒙 一骗卜、第九天 我趴在偏房一處隱蔽的房頂上張望宠页。 院中可真熱鬧左胞,春花似錦、人聲如沸举户。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,315評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽敛摘。三九已至门烂,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間兄淫,已是汗流浹背屯远。 一陣腳步聲響...
    開封第一講書人閱讀 31,539評論 1 262
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留捕虽,地道東北人慨丐。 一個月前我還...
    沈念sama閱讀 45,578評論 2 355
  • 正文 我出身青樓,卻偏偏與公主長得像泄私,于是被迫代替她去往敵國和親房揭。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,877評論 2 345

推薦閱讀更多精彩內(nèi)容

  • 轉(zhuǎn)載:http://www.reibang.com/p/b87fee2f7a23 前言 今天蓬痒,我們來介紹現(xiàn)今主流的...
    朝花夕拾不起來閱讀 3,184評論 2 27
  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語法,類相關(guān)的語法漆羔,內(nèi)部類的語法梧奢,繼承相關(guān)的語法,異常的語法演痒,線程的語...
    子非魚_t_閱讀 31,587評論 18 399
  • 1 XML解析No29 【 XML:可拓展標(biāo)記語言亲轨,語言和HTML類似,也是一種標(biāo)記語言鸟顺。 特點:標(biāo)記是自定義...
    征程_Journey閱讀 1,626評論 0 9
  • 夜深惦蚊,再沒有眼前的繁華可以麻痹這個無助的靈魂。把心掏出來讯嫂,一點一點切碎养筒,和著滾燙的血、苦澀的淚端姚,獨自咀嚼咽下晕粪,在無...
    朝話夕食閱讀 283評論 0 0
  • 許衡領(lǐng)著他的學(xué)生奔波于戰(zhàn)亂之途,路經(jīng)一梨園渐裸,學(xué)生迫于饑渴巫湘,紛紛摘梨装悲。許衡端坐園側(cè)巋然不動。學(xué)生說:園為無主之園...
    徐謐浮水流燈閱讀 421評論 0 3