03框架階段01cgb j加強(qiáng)v_第1頁(yè)
03框架階段01cgb j加強(qiáng)v_第2頁(yè)
03框架階段01cgb j加強(qiáng)v_第3頁(yè)
03框架階段01cgb j加強(qiáng)v_第4頁(yè)
03框架階段01cgb j加強(qiáng)v_第5頁(yè)
已閱讀5頁(yè),還剩28頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、齊雷 qilei1-1JAVA 基礎(chǔ)進(jìn)階1. 面向?qū)ο髴?yīng)用進(jìn)階1-21.1. JVM 內(nèi)存中的兩大對(duì)象1-21.1.1. 字節(jié)碼對(duì)象1-33.1.1. 類的實(shí)例對(duì)象1-33.2. JAVA 對(duì)象的四大特性1-4特性應(yīng)用1-.2.2. 擴(kuò)展特性應(yīng)用1-63.3. JAVA 中的兩大抽象類型1-63.3.1. 如何理解接口?1-73.3.2. 如何理解抽象類?1-74. 新特性應(yīng)用加強(qiáng)4-84.1. 泛型基礎(chǔ)加強(qiáng)4-84.1.1. 如何理解泛型?4-84.1.2. 為何使用泛型4-84.1.3. 泛型的應(yīng)用類型?4-84.1.4. 泛型的通配符?4-114.1.5. 泛型的上下界問(wèn)

2、題?4-114.1.6. 泛型類型擦除?4-124.2. 序列化基礎(chǔ)加強(qiáng)4-124.2.1. 何為對(duì)象序列化&反序列化?4-124.2.2. 序列化的應(yīng)用場(chǎng)景?4-134.2.3. 對(duì)象的序列化與反序列化實(shí)現(xiàn)?4-134.2.4. 序列化存在安全問(wèn)題如何解決?4-154.2.5. 序列化的粒度如何. 4-164.2.6. 序列化的性能問(wèn)題及如何優(yōu)化?4-174.3. 枚舉應(yīng)用基礎(chǔ)加強(qiáng)4-184.3.1. 如何理解枚舉4-18齊雷 qilei1-24.3.2. 枚舉應(yīng)用場(chǎng)景4-184.3.3. 枚舉的定義4-184.3.4. 枚舉的應(yīng)用?4-194.4. 注解應(yīng)用基礎(chǔ)加強(qiáng)4-214.4.

3、1. 如何理解注解(Annotation)?4-214.4.2. 注解(Annotation)應(yīng)用場(chǎng)景?4-214.4.3. 注解(Annotation)的定義及應(yīng)用?4-214.4.4. 注解應(yīng)用案例分析實(shí)現(xiàn)?4-22API 應(yīng)用進(jìn)階5-235.1. 反射應(yīng)用基礎(chǔ)加強(qiáng)5-245.1.1. 如何理解反射?5-245.1.2. 反射的應(yīng)用場(chǎng)景?5-. 反射API 及應(yīng)用加強(qiáng)5-255.2. 反射應(yīng)用基礎(chǔ)加強(qiáng)5-266. 綜合案例進(jìn)階6-266.1. 手寫 Spring 簡(jiǎn)易工廠6-266.1.1. 需求分析6-266.1.2. 業(yè)務(wù)設(shè)計(jì)6-266.1.3. 代碼實(shí)現(xiàn)6-277.

4、 總結(jié)7-277.1. 重難點(diǎn)分析7-277.2. 常見 FAQ7-287.3. 作業(yè)7-291. 面向?qū)ο髴?yīng)用進(jìn)階1.1. JVM 內(nèi)存中的兩大對(duì)象在 java 中可以將對(duì)象分為兩大體系:字節(jié)碼對(duì)象和實(shí)例對(duì)象齊雷 qilei1-31.1.1. 字節(jié)碼對(duì)象每個(gè)類在加載(將類讀到內(nèi)存)時(shí)都會(huì)創(chuàng)建一個(gè)字節(jié)碼對(duì)象,且這個(gè)對(duì)象在一個(gè)JVM 內(nèi)存中是唯一的.此對(duì)象中的是類的結(jié)構(gòu)信息.字節(jié)碼對(duì)象的獲取方式?(常用方式有三種)a) 類名.classb) Class.forName(“.類名”)c) 類的實(shí)例對(duì)象.getClass();說(shuō)明:字節(jié)碼對(duì)象是獲取類結(jié)構(gòu)信息的.思考:1.類加載時(shí)會(huì)做哪些事情?1)

5、構(gòu)建類的字節(jié)碼對(duì)象,類型為 Class 類型2) 可能會(huì)初始化類中的靜態(tài)變量(類變量)3) 可能會(huì)執(zhí)行類中的靜態(tài)代碼塊.(具體是否執(zhí)行由加載方式?jīng)Q定)2. 誰(shuí)負(fù)責(zé)將類加載(讀)到內(nèi)存中?1) 類加載器(ClassLoader)3. 誰(shuí)提供類加載器?(JDK或者第)3.1.1. 類的實(shí)例對(duì)象如何理解類的實(shí)例對(duì)象(類的對(duì)象)1) 客觀事務(wù)在內(nèi)存中的呈現(xiàn)(堆內(nèi)存中的一塊區(qū)域)2) 類的實(shí)例對(duì)象在同一個(gè) JVM 內(nèi)存中可以有多份.Java 中對(duì)象的創(chuàng)建方式1) 通過(guò) new 關(guān)鍵字創(chuàng)建2) 通過(guò)反射創(chuàng)建(首先要先獲取字節(jié)碼對(duì)象)Java 中對(duì)象的作用?齊雷 qilei1-4數(shù)據(jù)(變量:類變量,實(shí)例變量

6、,參數(shù)變量,局部變量)1)a) Pojo (普通的 java 對(duì)象)b) Vo (值對(duì)象)2) 執(zhí)行業(yè)務(wù)邏輯(方法):各司其職,各盡所能.a) Ctrollerb) Servicec) Dao建議:面向?qū)ο笤O(shè)計(jì)時(shí)不要設(shè)計(jì)一個(gè)大而全的對(duì)象.3.2. JAVA 對(duì)象的四大特性Java 中對(duì)象特性可從如下兩點(diǎn)進(jìn)行理解:特性:封裝,繼承,多態(tài)1)2) 擴(kuò)展特性:組合,例如圓(Circle)中有圓心(Point)3.2.1.特性應(yīng)用1.封裝特性1) 廣義封裝:一個(gè)項(xiàng)目有哪些系統(tǒng),一個(gè)系統(tǒng)由哪些模塊,.2) 狹義封裝:對(duì)象屬性,方法能公開則公開.封裝案例應(yīng)用:生活中的封裝:1) 廣義:大到有多個(gè)省份,小到

7、家庭有多少個(gè)成員.2) 狹義:每個(gè)人都有特征(個(gè)頭高,帥氣,漂亮),都有行為(說(shuō)話,跳舞,唱歌).框架中的封裝:1) mybatis:(封裝 JDBC 操作,對(duì) JDBC 參數(shù)處理,結(jié)果處理做了減法設(shè)計(jì))a) 廣義:(連接池模塊,緩存處理模塊,日志模塊處理,.)b) 狹義:(SqlSession 對(duì)象中應(yīng)該有什么,哪些設(shè)計(jì)為私有,哪些設(shè)計(jì)為公開)2) Spring:(封裝了對(duì)象的創(chuàng)建,對(duì)象的管理)齊雷 qilei1-5a) 廣義:(IOC,MVC,AOP,)b) 狹義:(ClassPathXmlApplicationContext 對(duì)象的)2.繼承特性1) 優(yōu)勢(shì): 實(shí)現(xiàn)代碼的復(fù)用, 提高程序的

8、擴(kuò)展性.( 案例分析: 自定義 ClassLoader)2) 劣勢(shì):大范圍擴(kuò)展可能會(huì)導(dǎo)致類,會(huì)降低代碼的可維護(hù)性.繼承應(yīng)用案例:1)生活中的繼承:a) 子承父業(yè)傳承b)2)框架中的繼承:a) Mybatis(PooledDataSource,ContextMap,PersistenceException.)b) Spring (ManagedList,FlashMap,AnnotationAttributes.)課堂練習(xí):如何基于 LinkedHashMap 實(shí)現(xiàn)一個(gè) LRU 算法的 Cahce 對(duì)象?提示:(方法:通過(guò)繼承)3.多態(tài)特性a) 編譯時(shí)多態(tài):方法的重載b) 運(yùn)行時(shí)多態(tài):同一個(gè)行為

9、(方法),因?qū)ο蟛煌憩F(xiàn)結(jié)果可能不同.說(shuō)明:此特性基于繼承特性,父類可以指向子類對(duì)象,基于此特性可以更好實(shí)現(xiàn)程序之間的解耦合,提高程序可擴(kuò)展性.多態(tài)案例應(yīng)用:1) 生活中多態(tài):a) 睡覺(jué):有的人磨牙,有的人說(shuō)夢(mèng)話,有的人打呼嚕,有的人夢(mèng)游,.齊雷 qilei1-6b) 吃飯:有的人細(xì)嚼慢咽,有的人狼吞虎咽,.2) 框架中多態(tài):a) Mybatis (Executor,SimpleExecutor,CachingExecutor)b) Spring (BeanbFactory,ClassPathXmlApplicationContext,.)3.2.2. 擴(kuò)展特性應(yīng)用組合特性可以理解為面向?qū)ο笾?/p>

10、的一個(gè)擴(kuò)展特性,即可多個(gè)對(duì)象通過(guò)相互關(guān)聯(lián)(協(xié)同),共同完成一個(gè)業(yè)務(wù)模塊功能.為什么要組合(相互關(guān)聯(lián))呢?1) 類設(shè)計(jì)時(shí)要遵循單一職責(zé)原則,即類設(shè)計(jì)時(shí)不要設(shè)計(jì)大而全的對(duì)象,對(duì)象職責(zé)越多引起類變化的就會(huì)。2) 類設(shè)計(jì)要各司其職,各盡所能,這樣可擴(kuò)展性和維護(hù)性都會(huì)比較好。組合案例應(yīng)用:1) 生活中的組合:a) 陸???法中 CS 戰(zhàn)隊(duì)b)2)程序或框架中的組合:a) 如何執(zhí)行一個(gè)JDBC 操作?(Connection,Statement,ResultSet 相互組合)b) 如何完成一個(gè) MyBatis 操作? (SqlSessionFactory,SqlSession,Executor,.)c) S

11、pring 框架可以理解為一個(gè)的業(yè)務(wù)功能.整合框架,通過(guò)整合(組合)完成具體3.3. JAVA 中的兩大抽象類型Java 中提供了兩大抽象類型齊雷 qilei1-71. 接口(interface)2. 抽象類3.3.1. 如何理解接口?接口:定義規(guī)范,標(biāo)準(zhǔn).(例如 javax.sql.DataSource)1) 解耦(對(duì)象之間存在耦合時(shí)盡量耦合與接口):解耦并不是沒(méi)有耦合2) 擴(kuò)展(一個(gè)接口可以有很多不同實(shí)現(xiàn)類,例如 List)接口案例應(yīng)用:1) 生活中的接口:usb 接口,汽車引擎接口,.2) 程序中的接口:a) JDK:javax.sql.DataSourceb) MyBatis:SqlS

12、essionFactory,SqlSession,Executor,.c) Spring:BeanFactory,ApplicationContext,.3.3.2. 如何理解抽象類?抽象類:(對(duì)標(biāo)準(zhǔn)的部分共性做實(shí)現(xiàn),特給子類實(shí)現(xiàn))1) 定義模板方法(封裝某個(gè)操作的具體步驟-業(yè)務(wù)共性),特給子類實(shí)現(xiàn).2) 不外界直接構(gòu)建對(duì)象(當(dāng)然此類中可以不存在抽象方法).抽象類案例應(yīng)用1) 生活中的抽象類:例如一些拼圖2) 程序中的抽象類:a) JDK (AbstractList,ClassLoader.) b)MyBatis(BaseExecutor,.) c)Spring(AbstractApplica

13、tionContext,.)齊雷 qilei4-84. 新特性應(yīng)用加強(qiáng)4.1. 泛型基礎(chǔ)加強(qiáng)4.1.1. 如何理解泛型?1. 參化類型,數(shù)是 JDK1.5 的新特性。(定義泛型時(shí)使用參數(shù)可以簡(jiǎn)單理解為形參),例如 List<E>,Map<K,V>2. 編譯時(shí)的一種類型, 此類型僅僅在編譯階段有效, 運(yùn)行時(shí)無(wú)效. 例如List<String>在運(yùn)行時(shí) String 會(huì)被擦除,最終系統(tǒng)會(huì)認(rèn)為都是 Object.4.1.2. 為何使用泛型泛型是進(jìn)行類型設(shè)計(jì)或方法的一種約束規(guī)范,基于此規(guī)范可以:1. 提高編程時(shí)靈活性(有點(diǎn)抽象,后續(xù)結(jié)合實(shí)例理解)。2. 提高程序運(yùn)行

14、時(shí)的性能。(在編譯階段解決一些運(yùn)行時(shí)需要關(guān)注的問(wèn)題,例如強(qiáng)轉(zhuǎn))說(shuō)明:泛型應(yīng)用相對(duì)比較簡(jiǎn)單,難點(diǎn)在泛型類或方法的設(shè)計(jì)上,通過(guò)這樣的設(shè)計(jì)如何對(duì)現(xiàn)有類進(jìn)行”減法設(shè)計(jì)”,提高類或方法的通用性.4.1.3. 泛型的應(yīng)用類型?泛型常用方式有三種(可參考 List<E>,Map<K,V)等接口定義):1.泛型類: class 類名<泛型,>2. 泛型接口:3. 泛型方法:interface 接口名<泛型,>修飾符 <泛型> 方法返回值類型方法名(形參)代碼實(shí)現(xiàn):齊雷 qilei4-9類泛型定義:(用于約束類中方法參數(shù)和方法返回值類型)類泛型應(yīng)用:關(guān)鍵代碼

15、分析說(shuō)明:泛型應(yīng)用時(shí)相當(dāng)于實(shí)參傳給形參,但是實(shí)參必須為對(duì)象類型。接口泛型定義:定義接口時(shí)指定泛型,用于約束接口方法參數(shù)類型以及方法返回值類型,這里無(wú)須關(guān)心此類要做什么,重點(diǎn)先了解語(yǔ)法.接口泛型應(yīng)用class ConvertTask implements Task<Param,Integer> Overridepublic Integer execute(String arg) / TODO Auto-generated method stubreturn Integer.parseInt(arg);interface Task<Param,Result>/思考map中的

16、泛型Map<K,V>/* 此方法用于執(zhí)行任務(wù)* param arg 其類型由泛型參數(shù)Param決定* return 其類型由泛型參數(shù)result決定*/Result execute(Param arg1);Container<Integer> c1=new Container<>(); c1.add(100);/自定封箱 Integer.valueOf(100)/c1.add("ABC"); Integer t1=c1.get();class Container<T>/類泛型:類名<泛型>public void a

17、dd(T t)/通過(guò)類泛型約束方法參數(shù)類型public T get()/通過(guò)類泛型約束方法返回值類型return null;齊雷 qilei4-10課堂練習(xí):寫一個(gè)線程安全的 ArrayList(至少保證 add 和 get 方法的線程安全)寫一個(gè)線程安全的 HashMap<至少保證 put 和 get 方法的線程安全)1)2)框架中相關(guān)泛型的應(yīng)用:方法泛型應(yīng)用:1)Mybatis2)Spring總結(jié):1) 泛型類和泛型接口用于約束類或接口中實(shí)例方法參數(shù)類型,返回值類型.2) 泛型類或泛型接口中實(shí)際泛型類型可以在定義子類或構(gòu)建其對(duì)象時(shí)傳入.3) 泛型方法用于約束本方法(實(shí)例方法或靜態(tài)方法

18、)的參數(shù)類型或返回值類型.4) 泛型類上的泛型不能約束類中靜態(tài)方法的泛型類型.課堂練習(xí):1) 定義一個(gè)對(duì)象工廠,負(fù)責(zé)基于 class 類型構(gòu)建類的實(shí)例對(duì)象a)類名為 ObjectFactoryclass ClassPathXmlApplicationContext/泛型方法:寫一個(gè)getBean方法(仿照spring)public <T>T getBean(Class<T> cls)return null;public <T>T getBean(String id,Class<T> cls)return null;class DefaultSql

19、Session/*泛型方法*/public <T>T getMapper(Class<T> cls)return null;齊雷 qilei4-11b)方法設(shè)計(jì) static <T>T newInstance (Class<T> cls)4.1.4. 泛型的通配符?通配符一般可以理解為一種通用的類型,在這里的通配符泛指一種不確定性類型.1.泛型應(yīng)用時(shí)有一個(gè)特殊符號(hào)”?”,可以代表一種任意參數(shù)類型(實(shí)參類型)。2.通配符泛型只能應(yīng)用于變量的定義。例如:Class<?>c1;例如:4.1.5. 泛型的上下界問(wèn)題?泛型在應(yīng)用時(shí)通常要指定對(duì)象

20、的上屆和下屆,其實(shí)現(xiàn)方式如下:1. 指定泛型下界:<?2. 指定泛型上界:<?super 類型>extends 類型>例如:分析對(duì)錯(cuò)/* 泛型通配符"?"的應(yīng)用* 說(shuō)明:"?"代表一種不確定的類型,* 當(dāng)使用一個(gè)泛型類時(shí)假如其類型不確定可以使用"?"替代*/public class TestGeneric05 public static void main(String args)throws Exception Class<Object> c1=Object.class;/類對(duì)象/System.o

21、ut.println(c1.toString();/"?"為泛型應(yīng)用的一個(gè)通配符/當(dāng)泛型應(yīng)用時(shí),無(wú)法判定具體類型時(shí),使用"?"替代/此案例在編譯階段根本無(wú)法確定字符串中的類型具體為何種類型. Class<?> c2=Class.forName("java.lang.Object");/Class<Log> c3=Class.forName("java.lang.Object"); 錯(cuò)誤System.out.println(c1=c2);齊雷 qilei4-12List<Object&g

22、t; list1=new ArrayList<String>(); 錯(cuò)誤List<String> list2=new ArrayList<Object>(); 錯(cuò)誤List<? extends CharSequence> list1=new ArrayList<String>(); 正確List<? super Integer> list2=new ArrayList<Number>();正確說(shuō)明:這種上下界一般會(huì)用于方法參數(shù)變量定義,方法返回值類型定義。案例實(shí)現(xiàn):類中方法定義4.1.6. 泛型類型擦除?泛型是

23、編譯時(shí)的一種類型,在運(yùn)行時(shí)無(wú)效,運(yùn)行時(shí)候都會(huì)變成 Object 類型。作業(yè):嘗試基于反射向 List<String> list=new ArrayList<String>()集合中添加整數(shù).4.2. 序列化基礎(chǔ)加強(qiáng)4.2.1. 何為對(duì)象序列化&反序列化?序列化和反序列化是 java 中進(jìn)行數(shù)據(jù)和數(shù)據(jù)傳輸?shù)?) 序列化:將對(duì)象轉(zhuǎn)換為字節(jié)的過(guò)程。2) 反序列化:將字節(jié)轉(zhuǎn)換為對(duì)象的過(guò)程。式.說(shuō)明:在當(dāng)前軟件行業(yè)中有時(shí)也會(huì)將對(duì)象轉(zhuǎn)換為字符串的過(guò)程理解為序列化,例class PrintUtilstatic void doPrint(List<? extends Ch

24、arSequence> list) System.out.println(list);static void doPrint(Set<? super Integer> set) System.out.println(list);齊雷 qilei4-13如將對(duì)象轉(zhuǎn)換為 json 格式的字符串。4.2.2. 序列化的應(yīng)用場(chǎng)景?序列化和反序列化通常應(yīng)用在:1) 網(wǎng)絡(luò)通訊(C/S):以字節(jié)方式在網(wǎng)絡(luò)中傳輸數(shù)據(jù)2) 數(shù)據(jù)(例如文件,緩存)說(shuō)明:項(xiàng)目一般用于數(shù)據(jù)的對(duì)象通常會(huì)實(shí)現(xiàn)序列化接口.便于基于java 中的序列化機(jī)制對(duì)對(duì)象進(jìn)行序列化操作.4.2.3. 對(duì)象的序列化與反序列化實(shí)現(xiàn)?ja

25、va 中如何實(shí)現(xiàn)對(duì)象的序列化和反序列化呢?一般要遵循如下幾個(gè)步驟1) 對(duì)象要實(shí)現(xiàn) Serializable 接口2) 添加序列化 id(為反序列化提供保障)3) 借助對(duì)象流對(duì)象實(shí)現(xiàn)序列化和反序列化?代碼實(shí)現(xiàn):定義一需要序列化的 java 類對(duì)象(用戶行為日志對(duì)象)class SysLog implements Serializableprivate static final long serialVersionUID = -6L;/*日志id*/private Integer id;/*操作用戶*/private String username;/private Date createdTim

26、e;public void setId(Integer id) this.id = id;public void setUsername(String username) this.username = username;Overridepublic String toString() 齊雷 qilei4-14定義測(cè)試類:說(shuō)明:1) Serializable 接口只起一個(gè)標(biāo)識(shí)性的作用.2) 建議實(shí)現(xiàn)序列化接口的類自動(dòng)生成一個(gè)序列化 id.假如沒(méi)有在類中顯式添加此 id,影響對(duì)象的序列化,但可能會(huì)對(duì)反序列化有影響.3) 系統(tǒng)底層會(huì)基于類的結(jié)構(gòu)信息自動(dòng)生成序列化 id.4) 序列化和反序列化的順序

27、應(yīng)該是一致的.public class TestSerializable01 public static void main(String args)throws Exception /1.構(gòu)建日志對(duì)象,并數(shù)據(jù)SysLog log=new SysLog(); log.setId(1); log.setUsername("tmooc");/2.構(gòu)建對(duì)象輸出流,將日志對(duì)象到文件ObjectOutputStream out=new ObjectOutputStream(new FileOutputStream("f1.data"); out.writeObje

28、ct(log);/out.writeInt(100);/整數(shù)序列化System.out.println("序列化ok"); out.close();/3.將文件中的日志數(shù)據(jù)讀出ObjectInputStream in=new ObjectInputStream(new FileInputStream("f1.data"); SysLog obj=(SysLog)in.readObject();/Integer result=in.readInt();/整數(shù)反序列化/System.out.println(result); in.close(); Syste

29、m.out.println(obj);return "SysLog id=" + id + ", username=" + username + ""齊雷 qilei4-154.2.4. 序列化存在安全問(wèn)題如何解決?java 中的默認(rèn)序列化是存在一些安全問(wèn)題的,例如對(duì)象序列化以后的字節(jié)通過(guò)網(wǎng)絡(luò)傳輸,有可能在網(wǎng)絡(luò)中被截取。那如何保證數(shù)據(jù)安全呢?通??梢栽趯?duì)象序列化時(shí)對(duì)對(duì)象內(nèi)容進(jìn)行加密,對(duì)象反序列化時(shí)對(duì)內(nèi)容進(jìn)行具體實(shí)現(xiàn)過(guò)程分析:。1) 在序列化對(duì)象中添加 writeObject(ObjectOutpuStream out)方法對(duì)內(nèi)容進(jìn)行加

30、密再執(zhí)行序列化。2) 在序列化對(duì)象中添加 readObject(ObjectInputStream in)方法對(duì)內(nèi)容先進(jìn)行反序列化然后在執(zhí)行操作代碼實(shí)現(xiàn):class SysLog implements Serializableprivate static final long serialVersionUID = -6L;/*日志id*/private Integer id;/*操作用戶*/private String username;/private Date createdTime; private void writeObject(ObjectOutputStream out) thr

31、ows IOException /1.獲取一個(gè)加密對(duì)象(java.util) Base64.Encoder encoder=Base64.getEncoder(); /2.對(duì)內(nèi)容進(jìn)行加密 byte array=encoder.encode(username.getBytes(); /3.將加密結(jié)果重新賦值給username username=new String(array); /4.執(zhí)行默認(rèn)序列化 out.defaultWriteObject();/序列化 /方法的是一種規(guī)范 private void readObject(ObjectInputStream in) throws IOExc

32、eption, ClassNotFoundException /1.執(zhí)行默認(rèn)反序列化 in.defaultReadObject(); /2.獲取對(duì)象 Base64.Decoder decoder=Base64.getDecoder(); /3.執(zhí)行操作 byte array=decoder.decode(username);/*此方在調(diào)用對(duì)象流的的writeObject方法時(shí)執(zhí)行*/齊雷 qilei4-16說(shuō)明: writeObject/readObject 方法:修飾符,返回值類型,方法名,參數(shù)應(yīng)與如上代碼相同(java 規(guī)范中定義)1)2) 兩個(gè)方在序列化和反序列化時(shí)由系統(tǒng)底層通過(guò)反射調(diào)用

33、.4.2.5. 序列化的粒度如何所謂序列化粒度一般指對(duì)象序列化時(shí),如何對(duì)象屬性的序列化。例如哪些序列化,哪些屬性不序列化。java 中的具體方案一般有兩種:方案 1:不需要序列化的屬性使用 Transient 修飾.當(dāng)少量屬性不需要序列化時(shí), 使用此關(guān)鍵字修飾比較方便. 例如 private transient Integer id;方案 2:讓序列化對(duì)象實(shí)現(xiàn) Externalizable 接口,指定屬性的序列化和反序列化過(guò)程, 但是要序列化的對(duì)象必須使用 public 修飾.代碼實(shí)現(xiàn):public class Message implements Externalizableprivate

34、Integer id;/10 private String title; private String content; private String createdTime;/序列化時(shí)調(diào)用Override username=new String(array); public void setId(Integer id) this.id = id;public void setUsername(String username) this.username = username;Overridepublic String toString() return "SysLog id=&qu

35、ot; + id + ", username=" + username + ""齊雷 qilei4-17其中:序列化和反序列化需要在 Externalizable 接口方法中進(jìn)行實(shí)現(xiàn).4.2.6. 序列化的性能問(wèn)題及如何優(yōu)化?序列化性能問(wèn)題目前市場(chǎng)上會(huì)借助一些第的框架進(jìn)行實(shí)現(xiàn),例如 kryo。說(shuō)明:可基于 kryo 嘗試將一個(gè)對(duì)象進(jìn)行序列化.public void writeExternal(ObjectOutput out) throws IOException out.writeUTF(title);/反序列化調(diào)用Overridepublic voi

36、d readExternal(ObjectInput in) throws IOException, ClassNotFoundException title=in.readUTF();public void setId(Integer id) this.id = id;public void setTitle(String title) this.title = title;public void setContent(String content) this.content = content;public void setCreatedTime(String createdTime) t

37、his.createdTime = createdTime;Overridepublic String toString() return "Message id=" + id + ", title=" + title + ", content=" + content+ ", createdTime=" + createdTime+ ""齊雷 qilei4-184.3. 枚舉應(yīng)用基礎(chǔ)加強(qiáng)4.3.1. 如何理解枚舉枚舉是 JDK1.5 以后推出的一種新的類型(特殊的類),主要用于更加嚴(yán)格的約束變量

38、類型,例如現(xiàn)有一個(gè)型如何定義?對(duì)象,此對(duì)象有一個(gè)屬性,請(qǐng)問(wèn)此屬性的類4.3.2. 枚舉應(yīng)用場(chǎng)景基于枚舉更好限定變量的取值,例如一個(gè)變量要求有 A,B,C 三個(gè)值,該如何定義?此時(shí)就可以使用枚舉,枚舉類中一般定義的是幾個(gè)固定的常量值.案例分析:1) JDK2) mybatis 中 Executor 對(duì)象的類型3) spring4.3.3. 枚舉的定義枚舉需要借助 enum 關(guān)鍵字進(jìn)行定義,例如:enum Week public enum ExecutorType SIMPLE, REUSE, BATCHpublic enum RetentionPolicy SOURCE, CLASS, RUNT

39、IME齊雷 qilei4-19其中:Week 中 MONDAY,TUESDAY 等都屬于枚舉的實(shí)例,這些實(shí)例都是在類加載時(shí)創(chuàng)建,可通過(guò)枚舉類名直接,例如 Week.MONDAY說(shuō)明:1) 每個(gè)枚舉類中都默認(rèn)有一個(gè)無(wú)參構(gòu)造函數(shù),默認(rèn)使用 private 修飾.2) 枚舉每個(gè)實(shí)例的創(chuàng)建都會(huì)初始化類中屬性(可以添加),調(diào)用類中構(gòu)造方法(默認(rèn)無(wú)參,當(dāng)然也可以添加帶參數(shù)的構(gòu)造函數(shù))4.3.4. 枚舉的應(yīng)用?案例 1:定義一枚舉類型,基于此類型約束Product 類中的變量.枚舉類定義(類)類定義測(cè)試類定義案例 2:定義枚舉,用于約束用戶類中的屬性public class TestEnum01 publi

40、c static void main(String args) Product pro=new Product(); pro.setGender(Gender.MALE);class Product/*要求*/private Gender gender=Gender.NONE;public void setGender(Gender gender) this.gender = gender;enum Gender/Gender.classMALE,FEMALE,NONE;MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY

41、齊雷 qilei4-20枚舉類定義:類中可以定義帶參數(shù)的構(gòu)造方法,構(gòu)建實(shí)例時(shí)為屬性賦值.會(huì)員類中枚舉類應(yīng)用測(cè)試類定義說(shuō)明:枚舉類型與字符串類型之間進(jìn)行轉(zhuǎn)換.public class TestEnum02 public static void main(String args) Member m=new Member();String sexStr="MALE"/將字符串轉(zhuǎn)換為枚舉類型時(shí),字符串的值需要/與枚舉類中的實(shí)例名相同(區(qū)分大小寫)/Sex sex=Sex.valueOf(sexStr);Sex sex=Enum.valueOf(Sex.class, sexStr);

42、 System.out.println(sex.getName(); m.setSex(sex);class Memberprivate Sex sex=Sex.MALE;public void setSex(Sex sex) this.sex = sex;enum Sex/枚舉類型的對(duì)象是在類加載時(shí)創(chuàng)建MALE("男"),FEMALE("女");/執(zhí)行帶參構(gòu)造函數(shù)private String name;private Sex(String name)=name;public String getName() return name;齊

43、雷 qilei4-214.4. 注解應(yīng)用基礎(chǔ)加強(qiáng)4.4.1. 如何理解注解(Annotation)?注解是:1) JDK1.5 推出的一種新的應(yīng)用類型(特殊的 class)2) 元數(shù)據(jù)(Meta Data):一種描述性類型,用于描述對(duì)象.例如Override4.4.2. 注解(Annotation)應(yīng)用場(chǎng)景?1) 描述類及其成員(屬性,方法):例如Override2) 替換項(xiàng)目中 xml 方式對(duì)相關(guān)對(duì)象的描述,例如<bean id=” class=”/>4.4.3. 注解(Annotation)的定義及應(yīng)用?在實(shí)際項(xiàng)目注解可能由第呢?定義,也可能會(huì)由我們定義.如何定義可以借助int

44、erface 關(guān)鍵字進(jìn)行定義,例如 Override 注解的應(yīng)用其中:1) Target 用于描述定義的注解能夠修飾的對(duì)象。2) Retention 用于描述定義的注解何時(shí)有效。案例實(shí)現(xiàn):定義注解 EntityTarget(value=METHOD)Retention(value=SOURCE) public interface Override齊雷 qilei4-22定義注解 ID使用注解描述類及成員說(shuō)明:我們定義的注解,包括框架中的很多注解基本都是運(yùn)行時(shí)有效。4.4.4. 注解應(yīng)用案例分析實(shí)現(xiàn)?實(shí)際項(xiàng)目中的注解:1) 與編譯器結(jié)合實(shí)用(Override),無(wú)須我們實(shí)現(xiàn)2) 與反射 API

45、結(jié)合使用(RequiredLog,Transaction,)案例:1) 通過(guò)反射獲取類上的注解2) 通過(guò)反射獲取屬性或方法上的注解。public class TestAnnotation01 public static void main(String args) /如何獲取類或?qū)傩缘壬厦孀⒔饽?/1.獲取字節(jié)碼對(duì)象() Class<?> cls=SysLog.class;Entityclass SysLog IDprivate Integer id;Retention(RetentionPolicy.RUNTIME) Target(ElementType.FIELD)/表示只能描

46、述屬性interface IDRetention(RetentionPolicy.RUNTIME) Target(ElementType.TYPE)/表示只能描述類interface Entity齊雷 qilei5-23案例增強(qiáng)實(shí)現(xiàn):課堂案例:嘗試寫一個(gè)工廠類,此類可以為使用Service 注解修飾的類創(chuàng)建對(duì)象,對(duì)象,提供一個(gè)外界可以獲取對(duì)象方法.Step01:定義 Service 注解1) 此注解可以修飾類2) 此注解在運(yùn)行時(shí)有效3) 注解中中定義 value 屬性,默認(rèn)值為空串”Step02:創(chuàng)建一個(gè) java 類1) 類名 SysUserService2) 使用 Service 注解描述

47、Step03:構(gòu)建一個(gè)工廠對(duì)象類型1) 類名 ObjectFactory2) 屬性 Map<String,Object> objMap;3) 方法:ObjectnewObject(Class<?> cls) 用于構(gòu)建類實(shí)例并存 map4) 方法:<T>T getObject(String key,Class<T> cls) 從 map 獲取對(duì)象說(shuō)明:可參考課堂代碼實(shí)現(xiàn).API 應(yīng)用進(jìn)階5./2.獲取類上的注解Entity entity=cls.getDeclaredAnnotation(Entity.class);/3.獲取 Entity 注解上

48、的內(nèi)容String value=entity.value(); boolean lazy=entity.lazy(); System.out.println(value); System.out.println(lazy);齊雷 qilei5-245.1. 反射應(yīng)用基礎(chǔ)加強(qiáng)5.1.1. 如何理解反射?反射是 Java 中特有的一種技術(shù),是 JAVA 中自省特性的一種實(shí)現(xiàn)(對(duì)象運(yùn)行態(tài)發(fā)現(xiàn)對(duì)象成員),可以基于此特性實(shí)現(xiàn) java 的動(dòng)態(tài)編程(例如對(duì)象創(chuàng)建,成員調(diào)用等).5.1.2. 反射的應(yīng)用場(chǎng)景?反射通常用于平臺(tái)或框架編程,例如:1) 框架中對(duì)象的構(gòu)建.2) 框架中方法的調(diào)用.框架中反射應(yīng)用案例

49、1) 對(duì)象創(chuàng)建a) mybatis 中的 resultType,resultMapb) spring 中的 bean2) 方法調(diào)用a) 對(duì)象 set 方法,get 方法,.層方法,.b) spring mvc總之:反射不能預(yù)知未來(lái),但可駕馭未來(lái),通過(guò)反射可以更好構(gòu)建一些編程框架,以實(shí)現(xiàn)通用性編程,從而達(dá)到簡(jiǎn)化代碼編寫。FAQ:1) 反射有什么缺陷?會(huì)存在一定的性能問(wèn)題.齊雷 qilei5-255.1.3. 反射API 及應(yīng)用加強(qiáng)反射應(yīng)用的為字節(jié)碼對(duì)象,任意的一個(gè)類在同一個(gè)JVM 內(nèi)部,字節(jié)碼對(duì)象是類的結(jié)構(gòu)信息.唯一的,此字節(jié)碼對(duì)象會(huì)在第一次類加載時(shí)創(chuàng)建,用于基于字節(jié)碼對(duì)象,我們可以獲取如下對(duì)象

50、:1) Constructor (構(gòu)造方法對(duì)象類型,基于此對(duì)象構(gòu)建類的實(shí)例對(duì)象)2) Field (屬性對(duì)象類型)3) Method (方法對(duì)象類型)4) Annotation(注解對(duì)象類型) 5) 反射案例應(yīng)用:基于類對(duì)象獲取無(wú)參構(gòu)造方法對(duì)象,并構(gòu)建類的實(shí)例對(duì)象.基于類對(duì)象獲取帶參構(gòu)造方法對(duì)象,并構(gòu)建類的實(shí)例對(duì)象.SuppressWarnings("unused")private static <T>T doCreateInstance( Class<T> cls,/字節(jié)碼對(duì)象Object args,/創(chuàng)建實(shí)例對(duì)象需要的實(shí)際參數(shù)Class<?

51、> paramTypes)throws Exception /1.獲取構(gòu)造方法對(duì)象Constructor<T> con=cls.getDeclaredConstructor(paramTypes);/2.基于構(gòu)造方法對(duì)象構(gòu)建類的實(shí)例對(duì)象return con.newInstance(args);/基于類的字節(jié)碼對(duì)象創(chuàng)建類的實(shí)例對(duì)象private static <T>T doCreateInstance( Class<T> cls) throws Exception/1.獲取類中的構(gòu)造方法對(duì)象Constructor<T> con= cls.ge

52、tDeclaredConstructor();/2.基于構(gòu)造方法對(duì)象構(gòu)建類的實(shí)例對(duì)象con.setAccessible(true);/設(shè)置構(gòu)造方法可return (T)con.newInstance();/默認(rèn)調(diào)用無(wú)參構(gòu)造函數(shù)齊雷 qilei6-265.2. 反射應(yīng)用基礎(chǔ)加強(qiáng)6. 綜合案例進(jìn)階6.1. 手寫 Spring 簡(jiǎn)易工廠6.1.1. 需求分析業(yè)務(wù)如下:其中配置文件的名字任意,可以直接放到 class 對(duì)應(yīng)的路徑.6.1.2. 業(yè)務(wù)設(shè)計(jì)齊雷 qilei7-271.業(yè)務(wù)架構(gòu)設(shè)計(jì)2.業(yè)務(wù)實(shí)現(xiàn)步驟設(shè)計(jì)1) 創(chuàng)建一個(gè)配置文件 spring-configs.xml,用于描述一些 bean 對(duì)象2

53、) 創(chuàng)建一個(gè) BeanDefinition 對(duì)象,用于封裝從配置文件的信息3) 創(chuàng)建一個(gè)工廠ClassPathXmlApplicationContext 對(duì)象,負(fù)責(zé)基于配置信息創(chuàng)建對(duì)象,對(duì)象,并對(duì)外提供對(duì)象的方式.說(shuō)明:1) 工廠中提供兩大 map,一個(gè)配置信息,一個(gè)實(shí)例信息2) 工廠中基于 DOM,從 xml 文件中信息并進(jìn)行封裝.6.1.3. 代碼實(shí)現(xiàn)嘗試實(shí)現(xiàn)7. 總結(jié)7.1. 重難點(diǎn)分析1. 內(nèi)存中的兩大對(duì)象:字節(jié)碼對(duì)象與實(shí)例對(duì)象2. JAVA 對(duì)象四大特性(封裝,繼承,多態(tài),組合):重點(diǎn)是宏觀視角.齊雷 qilei7-283. JAVA 中的兩大抽象:重點(diǎn)加強(qiáng)對(duì)標(biāo)準(zhǔn)的理解和認(rèn)識(shí).4. 泛型的定義及在框架中的應(yīng)用?5. 序列化定義及應(yīng)用實(shí)現(xiàn)分析6. 注解的定義及應(yīng)用7. 反射定義及應(yīng)用7.2. 常見 FAQ1. 面向?qū)ο笙嚓P(guān)1) 類的字節(jié)碼對(duì)象相關(guān)?ü 如何理解類加載?將類(字節(jié)碼文件)從磁盤,從網(wǎng)絡(luò)讀到內(nèi)存的過(guò)程.ü 類加載時(shí)會(huì)創(chuàng)建字節(jié)碼對(duì)象,請(qǐng)問(wèn)此對(duì)象中的是什么?(類結(jié)構(gòu)信息)ü 類加載時(shí)一定會(huì)執(zhí)行靜態(tài)代碼塊嗎?不一定,要看加載方式ü

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論