day38——反射Reflection
一酿箭、上節(jié)課回顧
IO流:
1、4大基類(lèi)流:
InputStream,
OutputStream准验,
Reader,
Writer廷没,
提供讀和寫(xiě)的方法
read()
write()
2糊饱、文件流:節(jié)點(diǎn)流
FileInputStream
FileOutputStream
FileReader
FileWriter
3、轉(zhuǎn)換流:處理流
InputStreamReader颠黎,
InputStream
OutputStreamWriter另锋,
OutputStream
字節(jié)-字符的橋梁,指定編碼集
4狭归、緩存流:處理流:高效(讀和寫(xiě)都發(fā)生在緩沖區(qū):數(shù)組夭坪,byte[],char[])
BufferedInputStream
BufferedOutputStream
BufferedReader
新增方法:readLine()——>String
BufferedWriter
新增方法:newLine()——>void
flush()
close()
5、對(duì)象流:
ObjectInputStream
ObjectOutputStream
直接讀和寫(xiě)對(duì)象:序列化
如果讓對(duì)象能夠進(jìn)行讀和寫(xiě)过椎,具有序列化的功能台舱。實(shí)現(xiàn)一個(gè)標(biāo)記接口:java.io.Serializable。就表示該類(lèi)具有序列化和反序列化的功能。serialVersionUID:代碼中顯示的生成竞惋。
序列化:對(duì)象——>二進(jìn)制數(shù)值柜去,serialVersionUID:1234
反序列化:二進(jìn)制數(shù)值——>對(duì)象,serialVersionUID:2234
6拆宛、打印流
PrintStream
PrintWriter
7嗓奢、內(nèi)存流
ByteArrayInputStream
ByteArrayOutputStream
網(wǎng)絡(luò)編程:
1、核心的三要素
A:協(xié)議:TCP浑厚,UDP
ServerSocket類(lèi):服務(wù)端
Socket類(lèi):客戶(hù)端
B:IP地址:標(biāo)識(shí)網(wǎng)絡(luò)中的主機(jī)
C:port端口:標(biāo)識(shí)主機(jī)中的程序
一個(gè)端口只能被一個(gè)程序所占用股耽。
2、網(wǎng)絡(luò)編程 流程&模型
服務(wù)器:
step1:創(chuàng)建ServerSocket類(lèi)钳幅,
step2:等待客戶(hù)端鏈接:accept()——>Socket
step3:獲取流:InputStream物蝙,OutputStream,
step4:關(guān)閉資源:socket敢艰,流
客戶(hù)端:
step1:創(chuàng)建Socket類(lèi)诬乞,申請(qǐng)鏈接服務(wù)器
step2:獲取流:InputStream,OutputStream钠导,
step3:關(guān)閉資源:socket震嫉,流
二、本節(jié)課內(nèi)容
2.1牡属、反射
執(zhí)行java程序的流程:
step1:編寫(xiě)源代碼
Person.java
step2:通過(guò)編譯器進(jìn)行編譯
Person.class
step3:解釋執(zhí)行字節(jié)碼文件
Person.class執(zhí)行了票堵。。
由JVM負(fù)責(zé)加載字節(jié)碼文件逮栅,從主函數(shù)中逐行的執(zhí)行悴势。。
根據(jù)類(lèi)措伐,創(chuàng)建對(duì)象
對(duì)象訪問(wèn)方法
對(duì)象訪問(wèn)屬性
反射:應(yīng)用特纤,大多數(shù)的框架開(kāi)發(fā)中,都是基于配置文件废士。叫潦。底層都是反射蝇完。官硝。。
Person類(lèi):
? 屬性:
? 構(gòu)造器:構(gòu)造函數(shù)短蜕,構(gòu)造方法氢架,用于創(chuàng)建對(duì)象
? 方法:靜態(tài)方法,非靜態(tài)方法
包含主函數(shù)的類(lèi)中:
? Person p1 = new Person();
? p1.屬性:可以賦值朋魔,取值
? p1.方法:執(zhí)行方法
反射:通過(guò)操作字節(jié)碼文件岖研,反過(guò)來(lái)獲取類(lèi)中的內(nèi)容:屬性,構(gòu)造,方法
? 構(gòu)造:實(shí)例化對(duì)象
? 屬性:訪問(wèn)屬性
? 方法:調(diào)用方法
反射的操作:
step1:獲取Class類(lèi)的對(duì)象
Class cls1 = ....
step2:操作Class類(lèi)的實(shí)例孙援,獲取字節(jié)碼文件中的內(nèi)容:字段屬性害淤,構(gòu)造方法,普通方法拓售。
2.2窥摄、Class類(lèi)
Class類(lèi):字節(jié)碼文件對(duì)應(yīng)的對(duì)象。
獲取Class類(lèi)的實(shí)例
方法一:
對(duì)象.getClass()——>Class類(lèi)的實(shí)例對(duì)象
Class cls1 = p1.getClass();
方法二:
類(lèi)名.class——>Class類(lèi)的實(shí)例對(duì)象
Class cls2 = Person.class;
方法三:
Class類(lèi)提供了一個(gè)靜態(tài)的方法:forName()
Class cls3 = Class.forName("包名.類(lèi)名");
2.3础淤、Constructor
Constructor類(lèi):構(gòu)造方法的對(duì)應(yīng)的對(duì)象崭放。
//重要思路:
//step1:獲取Class類(lèi)實(shí)例:
Class<?> cls1 = Person.class;
//step2:獲取Constructor類(lèi)實(shí)例:
Constructor<?> constructor2 = cls1.getConstructor(String.class,int.class);//public Person(String, int){}
//step3:根據(jù)構(gòu)造方法實(shí)例,創(chuàng)建類(lèi)的對(duì)象:Person對(duì)象
Person p2 = (Person) constructor2.newInstance("王二狗",30);
獲取構(gòu)造方法:
1鸽凶、獲取所有的public 的構(gòu)造方法:數(shù)組
Constructor<?>[] getConstructors()
2币砂、獲取單個(gè)的public 的構(gòu)造方法:具體的某一個(gè)構(gòu)造方法
Constructor<T> getConstructor(Class<?>... parameterTypes)
3、獲取所有的構(gòu)造方法:數(shù)據(jù)
Constructor<?>[] getDeclaredConstructors()
4玻侥、獲取單個(gè)構(gòu)造方法:具體的某一個(gè)構(gòu)造方法
Constructor<T> getDeclaredConstructor(Class<?>... parameterTypes)
創(chuàng)建對(duì)象:
T newInstance(Object... initargs)
使用此 Constructor 對(duì)象表示的構(gòu)造方法來(lái)創(chuàng)建該構(gòu)造方法的聲明類(lèi)的新實(shí)例决摧,并用指定的初始化參數(shù)初始化該實(shí)例。
2.4使碾、Field
Field類(lèi):詞義字段蜜徽,屬性
思路:
//step1:獲取Class類(lèi)的實(shí)例
//step2:獲取Field類(lèi)實(shí)例,表示屬性
//step3:訪問(wèn)實(shí)例的屬性票摇,進(jìn)行賦值
獲取Field實(shí)例:
//3.Field getDeclaredField(String name)
返回一個(gè) Field 對(duì)象拘鞋,該對(duì)象反映此 Class 對(duì)象所表示的類(lèi)或接口的指定已聲明字段。 /
//4.Field[] getDeclaredFields()
返回 Field 對(duì)象的一個(gè)數(shù)組矢门,這些對(duì)象反映此 Class 對(duì)象所表示的類(lèi)或接口所聲明的所有字段盆色。
操作屬性:
A:設(shè)置是否可以訪問(wèn):
field.setAccessible(true);
B:設(shè)置某個(gè)實(shí)例的該屬性值
field.set(對(duì)象,數(shù)據(jù));
2.5祟剔、Method
Method類(lèi):方法的實(shí)例
獲取方法:
Method getMethod(String name, Class<?>... parameterTypes)
返回一個(gè) Method 對(duì)象隔躲,它反映此 Class 對(duì)象所表示的類(lèi)或接口的指定公共成員方法。
Method[] getMethods() ;//本類(lèi)的和父類(lèi)的public類(lèi)型的方法物延。
返回一個(gè)包含某些 Method 對(duì)象的數(shù)組宣旱,這些對(duì)象反映此 Class 對(duì)象所表示的類(lèi)或接口(包括那些由該類(lèi)或接口聲明的以及從超類(lèi)和超接口繼承的那些的類(lèi)或接口)的公共 member 方法。
Method getDeclaredMethod(String name, Class<?>... parameterTypes)
返回一個(gè) Method 對(duì)象叛薯,該對(duì)象反映此 Class 對(duì)象所表示的類(lèi)或接口的指定已聲明方法浑吟。
Method[] getDeclaredMethods() //獲取本類(lèi)中所有的方法,但是不包括繼承來(lái)的
返回 Method 對(duì)象的一個(gè)數(shù)組耗溜,這些對(duì)象反映此 Class 對(duì)象表示的類(lèi)或接口聲明的所有方法组力,包括公共、保護(hù)抖拴、默認(rèn)(包)訪問(wèn)和私有方法燎字,但不包括繼承的方法。