![03框架階段01cgb j加強v_第1頁](http://file3.renrendoc.com/fileroot_temp3/2022-3/6/ce1c0efd-f0ed-4704-a30e-4337ed64618f/ce1c0efd-f0ed-4704-a30e-4337ed64618f1.gif)
![03框架階段01cgb j加強v_第2頁](http://file3.renrendoc.com/fileroot_temp3/2022-3/6/ce1c0efd-f0ed-4704-a30e-4337ed64618f/ce1c0efd-f0ed-4704-a30e-4337ed64618f2.gif)
![03框架階段01cgb j加強v_第3頁](http://file3.renrendoc.com/fileroot_temp3/2022-3/6/ce1c0efd-f0ed-4704-a30e-4337ed64618f/ce1c0efd-f0ed-4704-a30e-4337ed64618f3.gif)
![03框架階段01cgb j加強v_第4頁](http://file3.renrendoc.com/fileroot_temp3/2022-3/6/ce1c0efd-f0ed-4704-a30e-4337ed64618f/ce1c0efd-f0ed-4704-a30e-4337ed64618f4.gif)
![03框架階段01cgb j加強v_第5頁](http://file3.renrendoc.com/fileroot_temp3/2022-3/6/ce1c0efd-f0ed-4704-a30e-4337ed64618f/ce1c0efd-f0ed-4704-a30e-4337ed64618f5.gif)
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)
文檔簡介
1、齊雷 qilei1-1JAVA 基礎(chǔ)進階1. 面向?qū)ο髴?yīng)用進階1-21.1. JVM 內(nèi)存中的兩大對象1-21.1.1. 字節(jié)碼對象1-33.1.1. 類的實例對象1-33.2. JAVA 對象的四大特性1-4特性應(yīng)用1-.2.2. 擴展特性應(yīng)用1-63.3. JAVA 中的兩大抽象類型1-63.3.1. 如何理解接口?1-73.3.2. 如何理解抽象類?1-74. 新特性應(yīng)用加強4-84.1. 泛型基礎(chǔ)加強4-84.1.1. 如何理解泛型?4-84.1.2. 為何使用泛型4-84.1.3. 泛型的應(yīng)用類型?4-84.1.4. 泛型的通配符?4-114.1.5. 泛型的上下界問
2、題?4-114.1.6. 泛型類型擦除?4-124.2. 序列化基礎(chǔ)加強4-124.2.1. 何為對象序列化&反序列化?4-124.2.2. 序列化的應(yīng)用場景?4-134.2.3. 對象的序列化與反序列化實現(xiàn)?4-134.2.4. 序列化存在安全問題如何解決?4-154.2.5. 序列化的粒度如何. 4-164.2.6. 序列化的性能問題及如何優(yōu)化?4-174.3. 枚舉應(yīng)用基礎(chǔ)加強4-184.3.1. 如何理解枚舉4-18齊雷 qilei1-24.3.2. 枚舉應(yīng)用場景4-184.3.3. 枚舉的定義4-184.3.4. 枚舉的應(yīng)用?4-194.4. 注解應(yīng)用基礎(chǔ)加強4-214.4.
3、1. 如何理解注解(Annotation)?4-214.4.2. 注解(Annotation)應(yīng)用場景?4-214.4.3. 注解(Annotation)的定義及應(yīng)用?4-214.4.4. 注解應(yīng)用案例分析實現(xiàn)?4-22API 應(yīng)用進階5-235.1. 反射應(yīng)用基礎(chǔ)加強5-245.1.1. 如何理解反射?5-245.1.2. 反射的應(yīng)用場景?5-. 反射API 及應(yīng)用加強5-255.2. 反射應(yīng)用基礎(chǔ)加強5-266. 綜合案例進階6-266.1. 手寫 Spring 簡易工廠6-266.1.1. 需求分析6-266.1.2. 業(yè)務(wù)設(shè)計6-266.1.3. 代碼實現(xiàn)6-277.
4、 總結(jié)7-277.1. 重難點分析7-277.2. 常見 FAQ7-287.3. 作業(yè)7-291. 面向?qū)ο髴?yīng)用進階1.1. JVM 內(nèi)存中的兩大對象在 java 中可以將對象分為兩大體系:字節(jié)碼對象和實例對象齊雷 qilei1-31.1.1. 字節(jié)碼對象每個類在加載(將類讀到內(nèi)存)時都會創(chuàng)建一個字節(jié)碼對象,且這個對象在一個JVM 內(nèi)存中是唯一的.此對象中的是類的結(jié)構(gòu)信息.字節(jié)碼對象的獲取方式?(常用方式有三種)a) 類名.classb) Class.forName(“.類名”)c) 類的實例對象.getClass();說明:字節(jié)碼對象是獲取類結(jié)構(gòu)信息的.思考:1.類加載時會做哪些事情?1)
5、構(gòu)建類的字節(jié)碼對象,類型為 Class 類型2) 可能會初始化類中的靜態(tài)變量(類變量)3) 可能會執(zhí)行類中的靜態(tài)代碼塊.(具體是否執(zhí)行由加載方式?jīng)Q定)2. 誰負(fù)責(zé)將類加載(讀)到內(nèi)存中?1) 類加載器(ClassLoader)3. 誰提供類加載器?(JDK或者第)3.1.1. 類的實例對象如何理解類的實例對象(類的對象)1) 客觀事務(wù)在內(nèi)存中的呈現(xiàn)(堆內(nèi)存中的一塊區(qū)域)2) 類的實例對象在同一個 JVM 內(nèi)存中可以有多份.Java 中對象的創(chuàng)建方式1) 通過 new 關(guān)鍵字創(chuàng)建2) 通過反射創(chuàng)建(首先要先獲取字節(jié)碼對象)Java 中對象的作用?齊雷 qilei1-4數(shù)據(jù)(變量:類變量,實例變量
6、,參數(shù)變量,局部變量)1)a) Pojo (普通的 java 對象)b) Vo (值對象)2) 執(zhí)行業(yè)務(wù)邏輯(方法):各司其職,各盡所能.a) Ctrollerb) Servicec) Dao建議:面向?qū)ο笤O(shè)計時不要設(shè)計一個大而全的對象.3.2. JAVA 對象的四大特性Java 中對象特性可從如下兩點進行理解:特性:封裝,繼承,多態(tài)1)2) 擴展特性:組合,例如圓(Circle)中有圓心(Point)3.2.1.特性應(yīng)用1.封裝特性1) 廣義封裝:一個項目有哪些系統(tǒng),一個系統(tǒng)由哪些模塊,.2) 狹義封裝:對象屬性,方法能公開則公開.封裝案例應(yīng)用:生活中的封裝:1) 廣義:大到有多個省份,小到
7、家庭有多少個成員.2) 狹義:每個人都有特征(個頭高,帥氣,漂亮),都有行為(說話,跳舞,唱歌).框架中的封裝:1) mybatis:(封裝 JDBC 操作,對 JDBC 參數(shù)處理,結(jié)果處理做了減法設(shè)計)a) 廣義:(連接池模塊,緩存處理模塊,日志模塊處理,.)b) 狹義:(SqlSession 對象中應(yīng)該有什么,哪些設(shè)計為私有,哪些設(shè)計為公開)2) Spring:(封裝了對象的創(chuàng)建,對象的管理)齊雷 qilei1-5a) 廣義:(IOC,MVC,AOP,)b) 狹義:(ClassPathXmlApplicationContext 對象的)2.繼承特性1) 優(yōu)勢: 實現(xiàn)代碼的復(fù)用, 提高程序的
8、擴展性.( 案例分析: 自定義 ClassLoader)2) 劣勢:大范圍擴展可能會導(dǎo)致類,會降低代碼的可維護性.繼承應(yīng)用案例:1)生活中的繼承:a) 子承父業(yè)傳承b)2)框架中的繼承:a) Mybatis(PooledDataSource,ContextMap,PersistenceException.)b) Spring (ManagedList,FlashMap,AnnotationAttributes.)課堂練習(xí):如何基于 LinkedHashMap 實現(xiàn)一個 LRU 算法的 Cahce 對象?提示:(方法:通過繼承)3.多態(tài)特性a) 編譯時多態(tài):方法的重載b) 運行時多態(tài):同一個行為
9、(方法),因?qū)ο蟛煌憩F(xiàn)結(jié)果可能不同.說明:此特性基于繼承特性,父類可以指向子類對象,基于此特性可以更好實現(xiàn)程序之間的解耦合,提高程序可擴展性.多態(tài)案例應(yīng)用:1) 生活中多態(tài):a) 睡覺:有的人磨牙,有的人說夢話,有的人打呼嚕,有的人夢游,.齊雷 qilei1-6b) 吃飯:有的人細(xì)嚼慢咽,有的人狼吞虎咽,.2) 框架中多態(tài):a) Mybatis (Executor,SimpleExecutor,CachingExecutor)b) Spring (BeanbFactory,ClassPathXmlApplicationContext,.)3.2.2. 擴展特性應(yīng)用組合特性可以理解為面向?qū)ο笾?/p>
10、的一個擴展特性,即可多個對象通過相互關(guān)聯(lián)(協(xié)同),共同完成一個業(yè)務(wù)模塊功能.為什么要組合(相互關(guān)聯(lián))呢?1) 類設(shè)計時要遵循單一職責(zé)原則,即類設(shè)計時不要設(shè)計大而全的對象,對象職責(zé)越多引起類變化的就會。2) 類設(shè)計要各司其職,各盡所能,這樣可擴展性和維護性都會比較好。組合案例應(yīng)用:1) 生活中的組合:a) 陸海空,法中 CS 戰(zhàn)隊b)2)程序或框架中的組合:a) 如何執(zhí)行一個JDBC 操作?(Connection,Statement,ResultSet 相互組合)b) 如何完成一個 MyBatis 操作? (SqlSessionFactory,SqlSession,Executor,.)c) S
11、pring 框架可以理解為一個的業(yè)務(wù)功能.整合框架,通過整合(組合)完成具體3.3. JAVA 中的兩大抽象類型Java 中提供了兩大抽象類型齊雷 qilei1-71. 接口(interface)2. 抽象類3.3.1. 如何理解接口?接口:定義規(guī)范,標(biāo)準(zhǔn).(例如 javax.sql.DataSource)1) 解耦(對象之間存在耦合時盡量耦合與接口):解耦并不是沒有耦合2) 擴展(一個接口可以有很多不同實現(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. 如何理解抽象類?抽象類:(對標(biāo)準(zhǔn)的部分共性做實現(xiàn),特給子類實現(xiàn))1) 定義模板方法(封裝某個操作的具體步驟-業(yè)務(wù)共性),特給子類實現(xiàn).2) 不外界直接構(gòu)建對象(當(dāng)然此類中可以不存在抽象方法).抽象類案例應(yīng)用1) 生活中的抽象類:例如一些拼圖2) 程序中的抽象類:a) JDK (AbstractList,ClassLoader.) b)MyBatis(BaseExecutor,.) c)Spring(AbstractApplica
13、tionContext,.)齊雷 qilei4-84. 新特性應(yīng)用加強4.1. 泛型基礎(chǔ)加強4.1.1. 如何理解泛型?1. 參化類型,數(shù)是 JDK1.5 的新特性。(定義泛型時使用參數(shù)可以簡單理解為形參),例如 List<E>,Map<K,V>2. 編譯時的一種類型, 此類型僅僅在編譯階段有效, 運行時無效. 例如List<String>在運行時 String 會被擦除,最終系統(tǒng)會認(rèn)為都是 Object.4.1.2. 為何使用泛型泛型是進行類型設(shè)計或方法的一種約束規(guī)范,基于此規(guī)范可以:1. 提高編程時靈活性(有點抽象,后續(xù)結(jié)合實例理解)。2. 提高程序運行
14、時的性能。(在編譯階段解決一些運行時需要關(guān)注的問題,例如強轉(zhuǎn))說明:泛型應(yīng)用相對比較簡單,難點在泛型類或方法的設(shè)計上,通過這樣的設(shè)計如何對現(xiàn)有類進行”減法設(shè)計”,提高類或方法的通用性.4.1.3. 泛型的應(yīng)用類型?泛型常用方式有三種(可參考 List<E>,Map<K,V)等接口定義):1.泛型類: class 類名<泛型,>2. 泛型接口:3. 泛型方法:interface 接口名<泛型,>修飾符 <泛型> 方法返回值類型方法名(形參)代碼實現(xiàn):齊雷 qilei4-9類泛型定義:(用于約束類中方法參數(shù)和方法返回值類型)類泛型應(yīng)用:關(guān)鍵代碼
15、分析說明:泛型應(yīng)用時相當(dāng)于實參傳給形參,但是實參必須為對象類型。接口泛型定義:定義接口時指定泛型,用于約束接口方法參數(shù)類型以及方法返回值類型,這里無須關(guān)心此類要做什么,重點先了解語法.接口泛型應(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)/通過類泛型約束方法參數(shù)類型public T get()/通過類泛型約束方法返回值類型return null;齊雷 qilei4-10課堂練習(xí):寫一個線程安全的 ArrayList(至少保證 add 和 get 方法的線程安全)寫一個線程安全的 HashMap<至少保證 put 和 get 方法的線程安全)1)2)框架中相關(guān)泛型的應(yīng)用:方法泛型應(yīng)用:1)Mybatis2)Spring總結(jié):1) 泛型類和泛型接口用于約束類或接口中實例方法參數(shù)類型,返回值類型.2) 泛型類或泛型接口中實際泛型類型可以在定義子類或構(gòu)建其對象時傳入.3) 泛型方法用于約束本方法(實例方法或靜態(tài)方法
18、)的參數(shù)類型或返回值類型.4) 泛型類上的泛型不能約束類中靜態(tài)方法的泛型類型.課堂練習(xí):1) 定義一個對象工廠,負(fù)責(zé)基于 class 類型構(gòu)建類的實例對象a)類名為 ObjectFactoryclass ClassPathXmlApplicationContext/泛型方法:寫一個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è)計 static <T>T newInstance (Class<T> cls)4.1.4. 泛型的通配符?通配符一般可以理解為一種通用的類型,在這里的通配符泛指一種不確定性類型.1.泛型應(yīng)用時有一個特殊符號”?”,可以代表一種任意參數(shù)類型(實參類型)。2.通配符泛型只能應(yīng)用于變量的定義。例如:Class<?>c1;例如:4.1.5. 泛型的上下界問題?泛型在應(yīng)用時通常要指定對象
20、的上屆和下屆,其實現(xiàn)方式如下:1. 指定泛型下界:<?2. 指定泛型上界:<?super 類型>extends 類型>例如:分析對錯/* 泛型通配符"?"的應(yīng)用* 說明:"?"代表一種不確定的類型,* 當(dāng)使用一個泛型類時假如其類型不確定可以使用"?"替代*/public class TestGeneric05 public static void main(String args)throws Exception Class<Object> c1=Object.class;/類對象/System.o
21、ut.println(c1.toString();/"?"為泛型應(yīng)用的一個通配符/當(dāng)泛型應(yīng)用時,無法判定具體類型時,使用"?"替代/此案例在編譯階段根本無法確定字符串中的類型具體為何種類型. Class<?> c2=Class.forName("java.lang.Object");/Class<Log> c3=Class.forName("java.lang.Object"); 錯誤System.out.println(c1=c2);齊雷 qilei4-12List<Object&g
22、t; list1=new ArrayList<String>(); 錯誤List<String> list2=new ArrayList<Object>(); 錯誤List<? extends CharSequence> list1=new ArrayList<String>(); 正確List<? super Integer> list2=new ArrayList<Number>();正確說明:這種上下界一般會用于方法參數(shù)變量定義,方法返回值類型定義。案例實現(xiàn):類中方法定義4.1.6. 泛型類型擦除?泛型是
23、編譯時的一種類型,在運行時無效,運行時候都會變成 Object 類型。作業(yè):嘗試基于反射向 List<String> list=new ArrayList<String>()集合中添加整數(shù).4.2. 序列化基礎(chǔ)加強4.2.1. 何為對象序列化&反序列化?序列化和反序列化是 java 中進行數(shù)據(jù)和數(shù)據(jù)傳輸?shù)?) 序列化:將對象轉(zhuǎn)換為字節(jié)的過程。2) 反序列化:將字節(jié)轉(zhuǎn)換為對象的過程。式.說明:在當(dāng)前軟件行業(yè)中有時也會將對象轉(zhuǎn)換為字符串的過程理解為序列化,例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如將對象轉(zhuǎn)換為 json 格式的字符串。4.2.2. 序列化的應(yīng)用場景?序列化和反序列化通常應(yīng)用在:1) 網(wǎng)絡(luò)通訊(C/S):以字節(jié)方式在網(wǎng)絡(luò)中傳輸數(shù)據(jù)2) 數(shù)據(jù)(例如文件,緩存)說明:項目一般用于數(shù)據(jù)的對象通常會實現(xiàn)序列化接口.便于基于java 中的序列化機制對對象進行序列化操作.4.2.3. 對象的序列化與反序列化實現(xiàn)?ja
25、va 中如何實現(xiàn)對象的序列化和反序列化呢?一般要遵循如下幾個步驟1) 對象要實現(xiàn) Serializable 接口2) 添加序列化 id(為反序列化提供保障)3) 借助對象流對象實現(xiàn)序列化和反序列化?代碼實現(xiàn):定義一需要序列化的 java 類對象(用戶行為日志對象)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定義測試類:說明:1) Serializable 接口只起一個標(biāo)識性的作用.2) 建議實現(xiàn)序列化接口的類自動生成一個序列化 id.假如沒有在類中顯式添加此 id,影響對象的序列化,但可能會對反序列化有影響.3) 系統(tǒng)底層會基于類的結(jié)構(gòu)信息自動生成序列化 id.4) 序列化和反序列化的順序
27、應(yīng)該是一致的.public class TestSerializable01 public static void main(String args)throws Exception /1.構(gòu)建日志對象,并數(shù)據(jù)SysLog log=new SysLog(); log.setId(1); log.setUsername("tmooc");/2.構(gòu)建對象輸出流,將日志對象到文件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. 序列化存在安全問題如何解決?java 中的默認(rèn)序列化是存在一些安全問題的,例如對象序列化以后的字節(jié)通過網(wǎng)絡(luò)傳輸,有可能在網(wǎng)絡(luò)中被截取。那如何保證數(shù)據(jù)安全呢?通常可以在對象序列化時對對象內(nèi)容進行加密,對象反序列化時對內(nèi)容進行具體實現(xiàn)過程分析:。1) 在序列化對象中添加 writeObject(ObjectOutpuStream out)方法對內(nèi)容進行加
30、密再執(zhí)行序列化。2) 在序列化對象中添加 readObject(ObjectInputStream in)方法對內(nèi)容先進行反序列化然后在執(zhí)行操作代碼實現(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.獲取一個加密對象(java.util) Base64.Encoder encoder=Base64.getEncoder(); /2.對內(nèi)容進行加密 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.獲取對象 Base64.Decoder decoder=Base64.getDecoder(); /3.執(zhí)行操作 byte array=decoder.decode(username);/*此方在調(diào)用對象流的的writeObject方法時執(zhí)行*/齊雷 qilei4-16說明: writeObject/readObject 方法:修飾符,返回值類型,方法名,參數(shù)應(yīng)與如上代碼相同(java 規(guī)范中定義)1)2) 兩個方在序列化和反序列化時由系統(tǒng)底層通過反射調(diào)用
33、.4.2.5. 序列化的粒度如何所謂序列化粒度一般指對象序列化時,如何對象屬性的序列化。例如哪些序列化,哪些屬性不序列化。java 中的具體方案一般有兩種:方案 1:不需要序列化的屬性使用 Transient 修飾.當(dāng)少量屬性不需要序列化時, 使用此關(guān)鍵字修飾比較方便. 例如 private transient Integer id;方案 2:讓序列化對象實現(xiàn) Externalizable 接口,指定屬性的序列化和反序列化過程, 但是要序列化的對象必須使用 public 修飾.代碼實現(xiàn):public class Message implements Externalizableprivate
34、Integer id;/10 private String title; private String content; private String createdTime;/序列化時調(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 接口方法中進行實現(xiàn).4.2.6. 序列化的性能問題及如何優(yōu)化?序列化性能問題目前市場上會借助一些第的框架進行實現(xiàn),例如 kryo。說明:可基于 kryo 嘗試將一個對象進行序列化.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ǔ)加強4.3.1. 如何理解枚舉枚舉是 JDK1.5 以后推出的一種新的類型(特殊的類),主要用于更加嚴(yán)格的約束變量
38、類型,例如現(xiàn)有一個型如何定義?對象,此對象有一個屬性,請問此屬性的類4.3.2. 枚舉應(yīng)用場景基于枚舉更好限定變量的取值,例如一個變量要求有 A,B,C 三個值,該如何定義?此時就可以使用枚舉,枚舉類中一般定義的是幾個固定的常量值.案例分析:1) JDK2) mybatis 中 Executor 對象的類型3) spring4.3.3. 枚舉的定義枚舉需要借助 enum 關(guān)鍵字進行定義,例如:enum Week public enum ExecutorType SIMPLE, REUSE, BATCHpublic enum RetentionPolicy SOURCE, CLASS, RUNT
39、IME齊雷 qilei4-19其中:Week 中 MONDAY,TUESDAY 等都屬于枚舉的實例,這些實例都是在類加載時創(chuàng)建,可通過枚舉類名直接,例如 Week.MONDAY說明:1) 每個枚舉類中都默認(rèn)有一個無參構(gòu)造函數(shù),默認(rèn)使用 private 修飾.2) 枚舉每個實例的創(chuàng)建都會初始化類中屬性(可以添加),調(diào)用類中構(gòu)造方法(默認(rèn)無參,當(dāng)然也可以添加帶參數(shù)的構(gòu)造函數(shù))4.3.4. 枚舉的應(yīng)用?案例 1:定義一枚舉類型,基于此類型約束Product 類中的變量.枚舉類定義(類)類定義測試類定義案例 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)建實例時為屬性賦值.會員類中枚舉類應(yīng)用測試類定義說明:枚舉類型與字符串類型之間進行轉(zhuǎn)換.public class TestEnum02 public static void main(String args) Member m=new Member();String sexStr="MALE"/將字符串轉(zhuǎn)換為枚舉類型時,字符串的值需要/與枚舉類中的實例名相同(區(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/枚舉類型的對象是在類加載時創(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ǔ)加強4.4.1. 如何理解注解(Annotation)?注解是:1) JDK1.5 推出的一種新的應(yīng)用類型(特殊的 class)2) 元數(shù)據(jù)(Meta Data):一種描述性類型,用于描述對象.例如Override4.4.2. 注解(Annotation)應(yīng)用場景?1) 描述類及其成員(屬性,方法):例如Override2) 替換項目中 xml 方式對相關(guān)對象的描述,例如<bean id=” class=”/>4.4.3. 注解(Annotation)的定義及應(yīng)用?在實際項目注解可能由第呢?定義,也可能會由我們定義.如何定義可以借助int
44、erface 關(guān)鍵字進行定義,例如 Override 注解的應(yīng)用其中:1) Target 用于描述定義的注解能夠修飾的對象。2) Retention 用于描述定義的注解何時有效。案例實現(xiàn):定義注解 EntityTarget(value=METHOD)Retention(value=SOURCE) public interface Override齊雷 qilei4-22定義注解 ID使用注解描述類及成員說明:我們定義的注解,包括框架中的很多注解基本都是運行時有效。4.4.4. 注解應(yīng)用案例分析實現(xiàn)?實際項目中的注解:1) 與編譯器結(jié)合實用(Override),無須我們實現(xiàn)2) 與反射 API
45、結(jié)合使用(RequiredLog,Transaction,)案例:1) 通過反射獲取類上的注解2) 通過反射獲取屬性或方法上的注解。public class TestAnnotation01 public static void main(String args) /如何獲取類或?qū)傩缘壬厦孀⒔饽?/1.獲取字節(jié)碼對象() 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案例增強實現(xiàn):課堂案例:嘗試寫一個工廠類,此類可以為使用Service 注解修飾的類創(chuàng)建對象,對象,提供一個外界可以獲取對象方法.Step01:定義 Service 注解1) 此注解可以修飾類2) 此注解在運行時有效3) 注解中中定義 value 屬性,默認(rèn)值為空串”Step02:創(chuàng)建一個 java 類1) 類名 SysUserService2) 使用 Service 注解描述
47、Step03:構(gòu)建一個工廠對象類型1) 類名 ObjectFactory2) 屬性 Map<String,Object> objMap;3) 方法:ObjectnewObject(Class<?> cls) 用于構(gòu)建類實例并存 map4) 方法:<T>T getObject(String key,Class<T> cls) 從 map 獲取對象說明:可參考課堂代碼實現(xiàn).API 應(yīng)用進階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ǔ)加強5.1.1. 如何理解反射?反射是 Java 中特有的一種技術(shù),是 JAVA 中自省特性的一種實現(xiàn)(對象運行態(tài)發(fā)現(xiàn)對象成員),可以基于此特性實現(xiàn) java 的動態(tài)編程(例如對象創(chuàng)建,成員調(diào)用等).5.1.2. 反射的應(yīng)用場景?反射通常用于平臺或框架編程,例如:1) 框架中對象的構(gòu)建.2) 框架中方法的調(diào)用.框架中反射應(yīng)用案例
49、1) 對象創(chuàng)建a) mybatis 中的 resultType,resultMapb) spring 中的 bean2) 方法調(diào)用a) 對象 set 方法,get 方法,.層方法,.b) spring mvc總之:反射不能預(yù)知未來,但可駕馭未來,通過反射可以更好構(gòu)建一些編程框架,以實現(xiàn)通用性編程,從而達(dá)到簡化代碼編寫。FAQ:1) 反射有什么缺陷?會存在一定的性能問題.齊雷 qilei5-255.1.3. 反射API 及應(yīng)用加強反射應(yīng)用的為字節(jié)碼對象,任意的一個類在同一個JVM 內(nèi)部,字節(jié)碼對象是類的結(jié)構(gòu)信息.唯一的,此字節(jié)碼對象會在第一次類加載時創(chuàng)建,用于基于字節(jié)碼對象,我們可以獲取如下對象
50、:1) Constructor (構(gòu)造方法對象類型,基于此對象構(gòu)建類的實例對象)2) Field (屬性對象類型)3) Method (方法對象類型)4) Annotation(注解對象類型) 5) 反射案例應(yīng)用:基于類對象獲取無參構(gòu)造方法對象,并構(gòu)建類的實例對象.基于類對象獲取帶參構(gòu)造方法對象,并構(gòu)建類的實例對象.SuppressWarnings("unused")private static <T>T doCreateInstance( Class<T> cls,/字節(jié)碼對象Object args,/創(chuàng)建實例對象需要的實際參數(shù)Class<?
51、> paramTypes)throws Exception /1.獲取構(gòu)造方法對象Constructor<T> con=cls.getDeclaredConstructor(paramTypes);/2.基于構(gòu)造方法對象構(gòu)建類的實例對象return con.newInstance(args);/基于類的字節(jié)碼對象創(chuàng)建類的實例對象private static <T>T doCreateInstance( Class<T> cls) throws Exception/1.獲取類中的構(gòu)造方法對象Constructor<T> con= cls.ge
52、tDeclaredConstructor();/2.基于構(gòu)造方法對象構(gòu)建類的實例對象con.setAccessible(true);/設(shè)置構(gòu)造方法可return (T)con.newInstance();/默認(rèn)調(diào)用無參構(gòu)造函數(shù)齊雷 qilei6-265.2. 反射應(yīng)用基礎(chǔ)加強6. 綜合案例進階6.1. 手寫 Spring 簡易工廠6.1.1. 需求分析業(yè)務(wù)如下:其中配置文件的名字任意,可以直接放到 class 對應(yīng)的路徑.6.1.2. 業(yè)務(wù)設(shè)計齊雷 qilei7-271.業(yè)務(wù)架構(gòu)設(shè)計2.業(yè)務(wù)實現(xiàn)步驟設(shè)計1) 創(chuàng)建一個配置文件 spring-configs.xml,用于描述一些 bean 對象2
53、) 創(chuàng)建一個 BeanDefinition 對象,用于封裝從配置文件的信息3) 創(chuàng)建一個工廠ClassPathXmlApplicationContext 對象,負(fù)責(zé)基于配置信息創(chuàng)建對象,對象,并對外提供對象的方式.說明:1) 工廠中提供兩大 map,一個配置信息,一個實例信息2) 工廠中基于 DOM,從 xml 文件中信息并進行封裝.6.1.3. 代碼實現(xiàn)嘗試實現(xiàn)7. 總結(jié)7.1. 重難點分析1. 內(nèi)存中的兩大對象:字節(jié)碼對象與實例對象2. JAVA 對象四大特性(封裝,繼承,多態(tài),組合):重點是宏觀視角.齊雷 qilei7-283. JAVA 中的兩大抽象:重點加強對標(biāo)準(zhǔn)的理解和認(rèn)識.4. 泛型的定義及在框架中的應(yīng)用?5. 序列化定義及應(yīng)用實現(xiàn)分析6. 注解的定義及應(yīng)用7. 反射定義及應(yīng)用7.2. 常見 FAQ1. 面向?qū)ο笙嚓P(guān)1) 類的字節(jié)碼對象相關(guān)?ü 如何理解類加載?將類(字節(jié)碼文件)從磁盤,從網(wǎng)絡(luò)讀到內(nèi)存的過程.ü 類加載時會創(chuàng)建字節(jié)碼對象,請問此對象中的是什么?(類結(jié)構(gòu)信息)ü 類加載時一定會執(zhí)行靜態(tài)代碼塊嗎?不一定,要看加載方式ü
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年個人普通貨物運輸合同模板(三篇)
- 2025年二手房屋買賣合同范文(2篇)
- 2025年二人合伙開店協(xié)議經(jīng)典版(三篇)
- 2025年五年級語文教學(xué)工作總結(jié)參考范文(二篇)
- 2025年個人房產(chǎn)抵押借款合同標(biāo)準(zhǔn)版本(三篇)
- 2025年五金配件訂購買賣合同(三篇)
- 2025年產(chǎn)品銷售合作協(xié)議(三篇)
- 2025年專利實施合同參考樣本(三篇)
- 歷史建筑修復(fù)外包合同
- 教育產(chǎn)業(yè)基地建設(shè)居間協(xié)議
- 和平精英電競賽事
- 熱應(yīng)激的防與控
- 輸液港用無損傷針相關(guān)知識
- 高標(biāo)準(zhǔn)農(nóng)田施工組織設(shè)計(全)
- 職業(yè)安全健康工作總結(jié)(2篇)
- 14S501-1 球墨鑄鐵單層井蓋及踏步施工
- YB 4022-1991耐火泥漿荷重軟化溫度試驗方法(示差-升溫法)
- 水土保持方案中沉沙池的布設(shè)技術(shù)
- 現(xiàn)代企業(yè)管理 (全套完整課件)
- 走進本土項目化設(shè)計-讀《PBL項目化學(xué)習(xí)設(shè)計》有感
- 高中語文日積月累23
評論
0/150
提交評論