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]》

反射? 可以讓程序在運(yùn)行時"看到自己"

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)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

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

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