day38——反射Reflection
一、上節(jié)課回顧
IO流:
1、4大基類流:
InputStream,
OutputStream,
Reader,
Writer,
提供讀和寫的方法
read()
write()
2、文件流:節(jié)點流
FileInputStream
FileOutputStream
FileReader
FileWriter
3、轉(zhuǎn)換流:處理流
InputStreamReader,
InputStream
OutputStreamWriter,
OutputStream
字節(jié)-字符的橋梁,指定編碼集
4、緩存流:處理流:高效(讀和寫都發(fā)生在緩沖區(qū):數(shù)組,byte[],char[])
BufferedInputStream
BufferedOutputStream
BufferedReader
新增方法:readLine()——>String
BufferedWriter
新增方法:newLine()——>void
flush()
close()
5、對象流:
ObjectInputStream
ObjectOutputStream
直接讀和寫對象:序列化
如果讓對象能夠進行讀和寫,具有序列化的功能。實現(xiàn)一個標記接口:java.io.Serializable。就表示該類具有序列化和反序列化的功能。serialVersionUID:代碼中顯示的生成。
序列化:對象——>二進制數(shù)值,serialVersionUID:1234
反序列化:二進制數(shù)值——>對象,serialVersionUID:2234
6、打印流
PrintStream
PrintWriter
7、內(nèi)存流
ByteArrayInputStream
ByteArrayOutputStream
網(wǎng)絡(luò)編程:
1、核心的三要素
A:協(xié)議:TCP,UDP
ServerSocket類:服務(wù)端
Socket類:客戶端
B:IP地址:標識網(wǎng)絡(luò)中的主機
C:port端口:標識主機中的程序
一個端口只能被一個程序所占用。
2、網(wǎng)絡(luò)編程 流程&模型
服務(wù)器:
step1:創(chuàng)建ServerSocket類,
step2:等待客戶端鏈接:accept()——>Socket
step3:獲取流:InputStream,OutputStream,
step4:關(guān)閉資源:socket,流
客戶端:
step1:創(chuàng)建Socket類,申請鏈接服務(wù)器
step2:獲取流:InputStream,OutputStream,
step3:關(guān)閉資源:socket,流
ECHO程序:

2ECHO程序可以改聊天.png
程序分析:

1程序分析.png
文件上傳:

3文件上傳.png
二、本節(jié)課內(nèi)容
2.1、反射
執(zhí)行java程序的流程:
step1:編寫源代碼
Person.java
step2:通過編譯器進行編譯
Person.class
step3:解釋執(zhí)行字節(jié)碼文件
Person.class執(zhí)行了。。
由JVM負責加載字節(jié)碼文件,從主函數(shù)中逐行的執(zhí)行。。
根據(jù)類,創(chuàng)建對象
對象訪問方法
對象訪問屬性
反射:應用,大多數(shù)的框架開發(fā)中,都是基于配置文件。。底層都是反射。。。
Person類:
? 屬性:
? 構(gòu)造器:構(gòu)造函數(shù),構(gòu)造方法,用于創(chuàng)建對象
? 方法:靜態(tài)方法,非靜態(tài)方法
包含主函數(shù)的類中:
? Person p1 = new Person();
? p1.屬性:可以賦值,取值
? p1.方法:執(zhí)行方法
反射:通過操作字節(jié)碼文件,反過來獲取類中的內(nèi)容:屬性,構(gòu)造,方法
? 構(gòu)造:實例化對象
? 屬性:訪問屬性
? 方法:調(diào)用方法
反射的操作:
step1:獲取Class類的對象
Class cls1 = ....
step2:操作Class類的實例,獲取字節(jié)碼文件中的內(nèi)容:字段屬性,構(gòu)造方法,普通方法。

反射.png
2.2、Class類
Class類:字節(jié)碼文件對應的對象。
獲取Class類的實例
方法一:
對象.getClass()——>Class類的實例對象
Class cls1 = p1.getClass();
方法二:
類名.class——>Class類的實例對象
Class cls2 = Person.class;
方法三:
Class類提供了一個靜態(tài)的方法:forName()
Class cls3 = Class.forName("包名.類名");
2.3、Constructor
Constructor類:構(gòu)造方法的對應的對象。
//重要思路:
//step1:獲取Class類實例:
Class<?> cls1 = Person.class;
//step2:獲取Constructor類實例:
Constructor<?> constructor2 = cls1.getConstructor(String.class,int.class);//public Person(String, int){}
//step3:根據(jù)構(gòu)造方法實例,創(chuàng)建類的對象:Person對象
Person p2 = (Person) constructor2.newInstance("王二狗",30);
獲取構(gòu)造方法:
1、獲取所有的public 的構(gòu)造方法:數(shù)組
Constructor<?>[] getConstructors()
2、獲取單個的public 的構(gòu)造方法:具體的某一個構(gòu)造方法
Constructor<T> getConstructor(Class<?>... parameterTypes)
3、獲取所有的構(gòu)造方法:數(shù)據(jù)
Constructor<?>[] getDeclaredConstructors()
4、獲取單個構(gòu)造方法:具體的某一個構(gòu)造方法
Constructor<T> getDeclaredConstructor(Class<?>... parameterTypes)
創(chuàng)建對象:
T newInstance(Object... initargs)
使用此 Constructor 對象表示的構(gòu)造方法來創(chuàng)建該構(gòu)造方法的聲明類的新實例,并用指定的初始化參數(shù)初始化該實例。
2.4、Field
Field類:詞義字段,屬性
思路:
//step1:獲取Class類的實例
//step2:獲取Field類實例,表示屬性
//step3:訪問實例的屬性,進行賦值
獲取Field實例:
//3.Field getDeclaredField(String name)
返回一個 Field 對象,該對象反映此 Class 對象所表示的類或接口的指定已聲明字段。 /
//4.Field[] getDeclaredFields()
返回 Field 對象的一個數(shù)組,這些對象反映此 Class 對象所表示的類或接口所聲明的所有字段。
操作屬性:
A:設(shè)置是否可以訪問:
field.setAccessible(true);
B:設(shè)置某個實例的該屬性值
field.set(對象,數(shù)據(jù));
2.5、Method
Method類:方法的實例
獲取方法:
Method getMethod(String name, Class<?>... parameterTypes)
返回一個 Method 對象,它反映此 Class 對象所表示的類或接口的指定公共成員方法。
Method[] getMethods() ;//本類的和父類的public類型的方法。
返回一個包含某些 Method 對象的數(shù)組,這些對象反映此 Class 對象所表示的類或接口(包括那些由該類或接口聲明的以及從超類和超接口繼承的那些的類或接口)的公共 member 方法。
Method getDeclaredMethod(String name, Class<?>... parameterTypes)
返回一個 Method 對象,該對象反映此 Class 對象所表示的類或接口的指定已聲明方法。
Method[] getDeclaredMethods() //獲取本類中所有的方法,但是不包括繼承來的
返回 Method 對象的一個數(shù)組,這些對象反映此 Class 對象表示的類或接口聲明的所有方法,包括公共、保護、默認(包)訪問和私有方法,但不包括繼承的方法。