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();
}
}
】
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]
》
】
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字符串