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

下載本文檔

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

文檔簡介

1、JAVA 基礎(chǔ)進(jìn)階1. 面向?qū)ο髴?yīng)用進(jìn)階1-21.1. JVM 內(nèi)存中的兩大對象1-21.1.1. 字節(jié)碼對象1-31.1.2. 實(shí)例對象1-31.2. JAVA 對象的四大特性1-4特性應(yīng)用1-.2.2. 擴(kuò)展特性應(yīng)用1-61.3. JAVA 中的兩大抽象類型1-61.3.1. 如何理解接口?1-71.3.2. 如何理解抽象類?1-72. 新特性應(yīng)用加強(qiáng)4-82.1. 泛型基礎(chǔ)加強(qiáng)4-82.1.1. 如何理解泛型?4-82.1.2. 為何使用泛型4-82.1.3. 泛型的應(yīng)用類型?4-82.1.4. 泛型的通配符?4-112.1.5. 泛型的上下界問題?4-112.1.6.

2、泛型類型擦除?4-122.2. 序列化基礎(chǔ)加強(qiáng)4-122.2.1. 何為對象序列化&反序列化?4-122.2.2. 序列化的應(yīng)用場景?4-132.2.3. 對象的序列化與反序列化實(shí)現(xiàn)?4-132.2.4. 序列化存在安全問題如何解決?4-142.2.5. 序列化的粒度如何. 4-162.2.6. 序列化的性能問題及如何優(yōu)化?4-172.3. 枚舉應(yīng)用基礎(chǔ)加強(qiáng)4-182.3.1. 如何理解枚舉4-182.3.2. 枚舉應(yīng)用場景4-182.3.3. 枚舉的定義4-182.3.4. 枚舉的應(yīng)用?4-192.4. 注解應(yīng)用基礎(chǔ)加強(qiáng)4-212.4.1. 如何理解注解(Annotation)?4-

3、212.4.2. 注解(Annotation)應(yīng)用場景?4-212.4.3. 注解(Annotation)的定義及應(yīng)用?4-212.4.4. 注解應(yīng)用案例分析實(shí)現(xiàn)?4-22API 應(yīng)用進(jìn)階5-233.1. 反射應(yīng)用基礎(chǔ)加強(qiáng)5-243.1.1. 如何理解反射?5-243.1.2. 反射的應(yīng)用場景?5-. 反射API 及應(yīng)用加強(qiáng)5-253.2. 反射應(yīng)用基礎(chǔ)加強(qiáng)5-264. 綜合案例進(jìn)階6-264.1. 手寫 Spring 簡易工廠6-264.1.1. 需求分析6-264.1.2. 業(yè)務(wù)設(shè)計(jì)6-264.1.3. 代碼實(shí)現(xiàn)6-275. 總結(jié)7-275.1. 重難點(diǎn)分析7-275.2

4、. 常見 FAQ7-285.3. 作業(yè)7-281. 面向?qū)ο髴?yīng)用進(jìn)階1.1. JVM 內(nèi)存中的兩大對象在 java 中可以將對象分為兩大體系:字節(jié)碼對象和實(shí)例對象1.1.1. 字節(jié)碼對象每個類在加載(將類讀到內(nèi)存)時都會創(chuàng)建一個字節(jié)碼對象,且這個對象在一個JVM 內(nèi)存中是唯一的.此對象中的是類的結(jié)構(gòu)信息.字節(jié)碼對象的獲取方式?(常用方式有三種)a) 類名.classb) Class.forName(“.類名”)c) 類的實(shí)例對象.getClass();說明:字節(jié)碼對象是獲取類結(jié)構(gòu)信息的.思考:1.類加載時會做哪些事情?1) 構(gòu)建類的字節(jié)碼對象,類型為 Class 類型2) 可能會初始化類中的靜

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

6、) 執(zhí)行業(yè)務(wù)邏輯(方法):各司其職,各盡所能.a) Ctrollerb) Servicec) Dao建議:面向?qū)ο笤O(shè)計(jì)時不要設(shè)計(jì)一個大而全的對象.3.2. JAVA 對象的四大特性Java 中對象特性可從如下兩點(diǎn)進(jìn)行理解:特性:封裝,繼承,多態(tài)1)2) 擴(kuò)展特性:組合,例如圓(Circle)中有圓心(Point)3.2.1.特性應(yīng)用1.封裝特性1) 廣義封裝:一個項(xiàng)目有哪些系統(tǒng),一個系統(tǒng)由哪些模塊,.2) 狹義封裝:對象屬性,方法能公開則公開.封裝案例應(yīng)用:生活中的封裝:1) 廣義:大到有多個省份,小到家庭有多少個成員.2) 狹義:每個人都有特征(個頭高,帥氣,漂亮),都有行為(說話,跳舞,唱

7、歌).框架中的封裝:1) mybatis:(封裝 JDBC 操作,對 JDBC 參數(shù)處理,結(jié)果處理做了減法設(shè)計(jì))a) 廣義:(連接池模塊,緩存處理模塊,日志模塊處理,.)b) 狹義:(SqlSession 對象中應(yīng)該有什么,哪些設(shè)計(jì)為私有,哪些設(shè)計(jì)為公開)2) Spring:(封裝了對象的創(chuàng)建,對象的管理)a) 廣義:(IOC,MVC,AOP,)b) 狹義:(ClassPathXmlApplicationContext 對象的)2.繼承特性1) 優(yōu)勢: 實(shí)現(xiàn)代碼的復(fù)用, 提高程序的擴(kuò)展性.( 案例分析: 自定義 ClassLoader)2) 劣勢:大范圍擴(kuò)展可能會導(dǎo)致類,會降低代碼的可維護(hù)性.

8、繼承應(yīng)用案例:1)生活中的繼承:a) 子承父業(yè)傳承b)2)框架中的繼承:a) Mybatis(PooledDataSource,ContextMap,PersistenceException.)b) Spring (ManagedList,FlashMap,AnnotationAttributes.)課堂練習(xí):如何基于 LinkedHashMap 實(shí)現(xiàn)一個 LRU 算法的 Cahce 對象?提示:(方法:通過繼承)3.多態(tài)特性a) 編譯時多態(tài):方法的重載b) 運(yùn)行時多態(tài):同一個行為(方法),因?qū)ο蟛煌憩F(xiàn)結(jié)果可能不同.說明:此特性基于繼承特性,父類可以指向子類對象,基于此特性可以更好實(shí)現(xiàn)程序之

9、間的解耦合,提高程序可擴(kuò)展性.多態(tài)案例應(yīng)用:1) 生活中多態(tài):a) 睡覺:有的人磨牙,有的人說夢話,有的人打呼嚕,有的人夢游,.b) 吃飯:有的人細(xì)嚼慢咽,有的人狼吞虎咽,.2) 框架中多態(tài):a) Mybatis (Executor,SimpleExecutor,CachingExecutor)b) Spring (BeanbFactory,ClassPathXmlApplicationContext,.)3.2.2. 擴(kuò)展特性應(yīng)用組合特性可以理解為面向?qū)ο笾械囊粋€擴(kuò)展特性,即可多個對象通過相互關(guān)聯(lián)(協(xié)同),共同完成一個業(yè)務(wù)模塊功能.為什么要組合(相互關(guān)聯(lián))呢?1) 類設(shè)計(jì)時要遵循單一職責(zé)原則

10、,即類設(shè)計(jì)時不要設(shè)計(jì)大而全的對象,對象職責(zé)越多引起類變化的就會。2) 類設(shè)計(jì)要各司其職,各盡所能,這樣可擴(kuò)展性和維護(hù)性都會比較好。組合案例應(yīng)用:1) 生活中的組合:a) 陸???法中 CS 戰(zhàn)隊(duì)b)2)程序或框架中的組合:a) 如何執(zhí)行一個JDBC 操作?(Connection,Statement,ResultSet 相互組合)b) 如何完成一個 MyBatis 操作? (SqlSessionFactory,SqlSession,Executor,.)c) Spring 框架可以理解為一個的業(yè)務(wù)功能.整合框架,通過整合(組合)完成具體3.3. JAVA 中的兩大抽象類型Java 中提供了兩大抽

11、象類型1. 接口(interface)2. 抽象類3.3.1. 如何理解接口?接口:定義規(guī)范,標(biāo)準(zhǔn).(例如 javax.sql.DataSource)1) 解耦(對象之間存在耦合時盡量耦合與接口):解耦并不是沒有耦合2) 擴(kuò)展(一個接口可以有很多不同實(shí)現(xiàn)類,例如 List)接口案例應(yīng)用:1) 生活中的接口:usb 接口,汽車引擎接口,.2) 程序中的接口:a) JDK:javax.sql.DataSourceb) MyBatis:SqlSessionFactory,SqlSession,Executor,.c) Spring:BeanFactory,ApplicationContext,.3.

12、3.2. 如何理解抽象類?抽象類:(對標(biāo)準(zhǔn)的部分共性做實(shí)現(xiàn),特給子類實(shí)現(xiàn))1) 定義模板方法(封裝某個操作的具體步驟-業(yè)務(wù)共性),特給子類實(shí)現(xiàn).2) 不外界直接構(gòu)建對象(當(dāng)然此類中可以不存在抽象方法).抽象類案例應(yīng)用1) 生活中的抽象類:例如一些拼圖2) 程序中的抽象類:a) JDK (AbstractList,.) b)MyBatis(BaseExecutor,.) C)Spring(AbstractApplicationContext,.)4. 新特性應(yīng)用加強(qiáng)4.1. 泛型基礎(chǔ)加強(qiáng)4.1.1. 如何理解泛型?1. 參化類型,數(shù)是 JDK1.5 的新特性。(定義泛型時使用參數(shù)可以簡單理解為形

13、參),例如 List<E>,Map<K,V>2. 編譯時的一種類型, 此類型僅僅在編譯階段有效, 運(yùn)行時無效. 例如List<String>在運(yùn)行時 String 會被擦除,最終系統(tǒng)會認(rèn)為都是 Object.4.1.2. 為何使用泛型泛型是進(jìn)行類型設(shè)計(jì)或方法的一種約束規(guī)范,基于此規(guī)范可以:1. 提高編程時靈活性(有點(diǎn)抽象,后續(xù)結(jié)合實(shí)例理解)。2. 提高程序運(yùn)行時的性能。(在編譯階段解決一些運(yùn)行時需要關(guān)注的問題,例如強(qiáng)轉(zhuǎn))說明:泛型應(yīng)用相對比較簡單,難點(diǎn)在泛型類或方法的設(shè)計(jì)上,通過這樣的設(shè)計(jì)如何對現(xiàn)有類進(jìn)行減法設(shè)計(jì),提高類或方法的通用性.4.1.3. 泛型的應(yīng)

14、用類型?泛型常用方式有三種(可參考 List<E>,Map<K,V)等接口定義):1.泛型類: class 類名<泛型,>2. 泛型接口:3. 泛型方法:interface 接口名<泛型,>修飾符 <泛型> 方法返回值類型方法名(形參)代碼實(shí)現(xiàn):類泛型定義:(用于約束類中方法參數(shù)和方法返回值類型)類泛型應(yīng)用:關(guān)鍵代碼分析說明:泛型應(yīng)用時相當(dāng)于實(shí)參傳給形參,但是實(shí)參必須為對象類型。接口泛型定義:定義接口時指定泛型,用于約束接口方法參數(shù)類型以及方法返回值類型,這里無須關(guān)心此類要做什么,重點(diǎn)先了解語法.接口泛型應(yīng)用class ConvertTas

15、k implements Task<String,Integer> Overridepublic Integer execute(String arg) / TODO Auto-generated method stubreturn Integer.parseInt(arg);interface Task<Param,Result>/思考map中的泛型Map<K,V>/* 此方法用于執(zhí)行任務(wù)* param arg 其類型由泛型參數(shù)Param決定* return 其類型由泛型參數(shù)result決定*/Result execute(Param arg);Conta

16、iner<Integer> c1=new Container<>(); c1.add(100);/自定封箱 Integer.valueOf(100)/c1.add("ABC"); Integer t1=c1.get();class Container<T>/類泛型:類名<泛型>public void add(T t)/通過類泛型約束方法參數(shù)類型public T get()/通過類泛型約束方法返回值類型return null;課堂練習(xí):寫一個線程安全的 ArrayList(至少保證 add 和 get 方法的線程安全)寫一個線程

17、安全的 HashMap<至少保證 put 和 get 方法的線程安全)1)2)方法泛型應(yīng)用:總結(jié):1) 泛型類和泛型接口用于約束類或接口中實(shí)例方法參數(shù)類型,返回值類型.2) 泛型類或泛型接口中實(shí)際泛型類型可以在定義子類或構(gòu)建其對象時傳入.3) 泛型方法用于約束本方法(實(shí)例方法或靜態(tài)方法)的參數(shù)類型或返回值類型.4) 泛型類上的泛型不能約束類中靜態(tài)方法的泛型類型.課堂練習(xí):1) 定義一個對象工廠,負(fù)責(zé)基于 class 類型構(gòu)建類的實(shí)例對象a) 類名為 ObjectFactoryb) 方法設(shè)計(jì)<T>T newInstance (Class<T> cls)class C

18、lassPathXmlApplicationContext/泛型方法:寫一個getBean方法(仿照spring)public <T>T getBean(Class<T> cls)return null;public <T>T getBean(String id,Class<T> cls)return null;class DefaultSqlSession/*泛型方法*/public <T>T getMapper(Class<T> cls)return null;4.1.4. 泛型的通配符?通配符一般可以理解為一種通用的

19、類型,在這里的通配符泛指一種不確定性類型.1.泛型應(yīng)用時有一個特殊符號”?”,可以代表一種任意參數(shù)類型(實(shí)參類型)。2.通配符泛型只能應(yīng)用于變量的定義。例如:Class<?>c1;例如:4.1.5. 泛型的上下界問題?泛型在應(yīng)用時通常要指定對象的上屆和下屆,其實(shí)現(xiàn)方式如下:1. 指定泛型下界:<?2. 指定泛型上界:<?super 類型>extends 類型>例如:分析對錯List<Object> list1=new ArrayList<String>(); 錯誤List<String> list2=new ArrayLi

20、st<Object>(); 錯誤class Log/* 泛型通配符"?"的應(yīng)用* 說明:"?"代表一種不確定的類型,* 當(dāng)使用一個泛型類時假如其類型不確定可以使用"?"替代*/public class TestGeneric05 public static void main(String args)throws Exception Class<Log> c1=Log.class; /類對象/System.out.println(c1.toString();/"?"為泛型應(yīng)用的一個通配符/當(dāng)

21、泛型應(yīng)用時,無法判定具體類型時,使用"?"替代/此案例在編譯階段根本無法確定字符串中的類型具體為何種類型. Class<?> c2=Class.forName("com.java.generic.Log");/Class<Log> c3=Class.forName("com.java.generic.Log"); 錯誤System.out.println(c1=c2);List<? extends CharSequence> list1=new ArrayList<String>();

22、正確List<? super Integer> list2=new ArrayList<Number>();正確說明:這種上下界一般會用于方法參數(shù)變量定義,方法返回值類型定義。案例實(shí)現(xiàn):類中方法定義4.1.6. 泛型類型擦除?泛型是編譯時的一種類型,在運(yùn)行時無效,運(yùn)行時候都會變成 Object 類型。作業(yè):嘗試基于反射向 List<String> list=new ArrayList<String>()集合中添加整數(shù).4.2. 序列化基礎(chǔ)加強(qiáng)4.2.1. 何為對象序列化&反序列化?序列化和反序列化是 java 中進(jìn)行數(shù)據(jù)和數(shù)據(jù)傳輸?shù)?)

23、序列化:將對象轉(zhuǎn)換為字節(jié)的過程。2) 反序列化:將字節(jié)轉(zhuǎn)換為對象的過程。式.說明:在當(dāng)前軟件行業(yè)中有時也會將對象轉(zhuǎn)換為字符串的過程理解為序列化,例如將對象轉(zhuǎn)換為 json 格式的字符串。class PrintUtilstatic void doPrint(List<? extends CharSequence> list) System.out.println(list);static void doPrint(Set<? super Integer> set) System.out.println(list);4.2.2. 序列化的應(yīng)用場景?序列化和反序列化通常應(yīng)用在

24、:1) 網(wǎng)絡(luò)通訊(C/S):以字節(jié)方式在網(wǎng)絡(luò)中傳輸數(shù)據(jù)2) 數(shù)據(jù)(例如文件,緩存)說明:項(xiàng)目一般用于數(shù)據(jù)的對象通常會實(shí)現(xiàn)序列化接口.便于基于java 中的序列化機(jī)制對對象進(jìn)行序列化操作.4.2.3. 對象的序列化與反序列化實(shí)現(xiàn)?java 中如何實(shí)現(xiàn)對象的序列化和反序列化呢?一般要遵循如下幾個步驟1) 對象要實(shí)現(xiàn) Serializable 接口2) 添加序列化 id(為反序列化提供保障)3) 借助對象流對象實(shí)現(xiàn)序列化和反序列化?代碼實(shí)現(xiàn):定義一需要序列化的 java 類對象(用戶行為日志對象)class SysLog implements Serializableprivate static f

25、inal long serialVersionUID = -6L;/*日志id*/private Integer id;/*操作用戶*/private String username;/private Date createdTime;public void setId(Integer id) this.id = id;public void setUsername(String username) this.username = username;Overridepublic String toString() return "SysLog id=" + id + &qu

26、ot;, username=" + username + ""定義測試類:說明:1) Serializable 接口只起一個標(biāo)識性的作用.2) 建議實(shí)現(xiàn)序列化接口的類自動生成一個序列化 id.假如沒有在類中顯式添加此 id,影響對象的序列化,但可能會對反序列化有影響.3) 系統(tǒng)底層會基于類的結(jié)構(gòu)信息自動生成序列化 id.4) 序列化和反序列化的順序應(yīng)該是一致的.4.2.4. 序列化存在安全問題如何解決?java 中的默認(rèn)序列化是存在一些安全問題的,例如對象序列化以后的字節(jié)通過public class TestSerializable01 public static

27、 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.writeObject(log);/out.writeInt(100);/整數(shù)序列化System.out.println(

28、"序列化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(); System.out.println(obj);網(wǎng)絡(luò)傳輸,有可能在網(wǎng)絡(luò)中被截取。那如何保證數(shù)據(jù)安全呢?通??梢栽趯?/p>

29、象序列化時對對象內(nèi)容進(jìn)行加密,對象反序列化時對內(nèi)容進(jìn)行具體實(shí)現(xiàn)過程分析:。1) 在序列化對象中添加 writeObject(ObjectOutpuStream out)方法對內(nèi)容進(jìn)行加密再執(zhí)行序列化。2) 在序列化對象中添加 readObject(ObjectInputStream in)方法對內(nèi)容先進(jìn)行反序列化然后在執(zhí)行操作代碼實(shí)現(xiàn):class SysLog implements Serializableprivate static final long serialVersionUID = -6L;/*日志id*/private Integer id;/*操作用戶*/private Str

30、ing username;/private Date createdTime; private void writeObject(ObjectOutputStream out) throws IOException /1.獲取一個加密對象(java.util) Base64.Encoder encoder=Base64.getEncoder(); /2.對內(nèi)容進(jìn)行加密 byte array=encoder.encode(username.getBytes(); /3.將加密結(jié)果重新賦值給username username=new String(array); /4.執(zhí)行默認(rèn)序列化 out.de

31、faultWriteObject();/序列化 /方法的是一種規(guī)范 private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException /1.執(zhí)行默認(rèn)反序列化 in.defaultReadObject(); /2.獲取對象 Base64.Decoder decoder=Base64.getDecoder(); /3.執(zhí)行操作 byte array=decoder.decode(username); username=new String(array); public void setI

32、d(Integer id) /*此方在調(diào)用對象流的的writeObject方法時執(zhí)行*/說明: writeObject/readObject 方法:修飾符,返回值類型,方法名,參數(shù)應(yīng)與如上代碼相同(java 規(guī)范中定義)1)2) 兩個方在序列化和反序列化時由系統(tǒng)底層通過反射調(diào)用.4.2.5. 序列化的粒度如何所謂序列化粒度一般指對象序列化時,如何對象屬性的序列化。例如哪些序列化,哪些屬性不序列化。java 中的具體方案一般有兩種:方案 1:不需要序列化的屬性使用 Transient 修飾.當(dāng)少量屬性不需要序列化時, 使用此關(guān)鍵字修飾比較方便. 例如 private transient Inte

33、ger id;方案 2:讓序列化對象實(shí)現(xiàn) Externalizable 接口,指定屬性的序列化和反序列化過程, 但是要序列化的對象必須使用 public 修飾.代碼實(shí)現(xiàn):public class Message implements Externalizableprivate Integer id;/10 private String title; private String content; private String createdTime;/序列化時調(diào)用Overridepublic void writeExternal(ObjectOutput out) throws IOExcep

34、tion out.writeUTF(title);/反序列化調(diào)用this.id = id;public void setUsername(String username) this.username = username;Overridepublic String toString() return "SysLog id=" + id + ", username=" + username + ""其中:序列化和反序列化需要在 Externalizable 接口方法中進(jìn)行實(shí)現(xiàn).4.2.6. 序列化的性能問題及如何優(yōu)化?序列化性能問題目前

35、市場上會借助一些第的框架進(jìn)行實(shí)現(xiàn),例如 kryo。說明:可基于 kryo 嘗試將一個對象進(jìn)行序列化.Overridepublic void 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) thi

36、s.content = content;public void setCreatedTime(String createdTime) this.createdTime = createdTime;Overridepublic String toString() return "Message id=" + id + ", title=" + title + ", content=" + content+ ", createdTime=" + createdTime+ ""4.3. 枚舉應(yīng)用基礎(chǔ)加

37、強(qiáng)4.3.1. 如何理解枚舉枚舉是 JDK1.5 以后推出的一種新的類型(特殊的類),主要用于更加嚴(yán)格的約束變量類型,例如現(xiàn)有一個型如何定義?對象,此對象有一個屬性,請問此屬性的類4.3.2. 枚舉應(yīng)用場景基于枚舉更好限定變量的取值,例如一個變量要求有 A,B,C 三個值,該如何定義?此時就可以使用枚舉,枚舉類中一般定義的是幾個固定的常量值.案例分析:1) JDK2) mybatis 中 Executor 對象的類型3) spring4.3.3. 枚舉的定義枚舉需要借助 enum 關(guān)鍵字進(jìn)行定義,例如:enum Week public enum ExecutorType SIMPLE, REU

38、SE, BATCHpublic enum RetentionPolicy SOURCE, CLASS, RUNTIME其中:Week 中 MONDAY,TUESDAY 等都屬于枚舉的實(shí)例,這些實(shí)例都是在類加載時創(chuàng)建,可通過枚舉類名直接,例如 Week.MONDAY說明:1) 每個枚舉類中都默認(rèn)有一個無參構(gòu)造函數(shù),默認(rèn)使用 private 修飾.2) 枚舉每個實(shí)例的創(chuàng)建都會初始化類中屬性(可以添加),調(diào)用類中構(gòu)造方法(默認(rèn)無參,當(dāng)然也可以添加帶參數(shù)的構(gòu)造函數(shù))4.3.4. 枚舉的應(yīng)用?案例 1:定義一枚舉類型,基于此類型約束Product 類中的變量.枚舉類定義(類)類定義測試類定義案例 2:定

39、義枚舉,用于約束用戶類中的屬性public class TestEnum01 public 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, W

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

41、Enum.valueOf(Sex.class, sexStr); 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;publi

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

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

44、與反射 API 結(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.FIEL

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

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

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

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

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

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

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

52、athXmlApplicationContext 對象,負(fù)責(zé)基于配置信息創(chuàng)建對象,對象,并對外提供對象的方式.說明:1) 工廠中提供兩大 map,一個配置信息,一個實(shí)例信息2) 工廠中基于 DOM,從 xml 文件中信息并進(jìn)行封裝.6.1.3. 代碼實(shí)現(xiàn)嘗試實(shí)現(xiàn)7. 總結(jié)7.1. 重難點(diǎn)分析1. 序列化及應(yīng)用實(shí)現(xiàn)2. 泛型的定義及應(yīng)用3. 注解的定義及應(yīng)用4. 反射定義及應(yīng)用7.2. 常見 FAQ1. 如何理解 Java 中的兩種對象?2. 如何獲取類的類加載器對象?3. 如何理解面向?qū)ο笾械娜筇匦?7.3. 作業(yè)Day01:1. 基于 LinkedList 編寫一個 Stack 容器(算法

53、先進(jìn)后出)?2. 基于 LinkedHashMap 編寫一個線程安全的 LruCache 容器?class LRUCache<K,V> extends LinkedHashMap<K, V> private static final long serialVersionUID = 1L; protected int maxElements;public LRUCache(int maxSize) class Stack<E>private LinkedList<E> list=new LinkedList<>();/* 入棧* par

54、am e*/public void push(E e) list.addFirst(e);/* 出棧* return*/public E pop() return list.pop();Day02:1. 基于”數(shù)組”結(jié)構(gòu)寫一個”FIFO”算法的隊(duì)列容器.(嘗試去做)1) 類名:Container<T>2) 方法:add(T t),take()實(shí)現(xiàn)分析:添加操作實(shí)現(xiàn)分析:取操作實(shí)現(xiàn)super(maxSize,0.75f, true);/true 表示元素順序this.maxElements = maxSize;/* 此方法的返回值決定容器中是否要移除元素.* 1)true 表示移除元素* 2)false 表示不移除*/ Overrideprotected boolean removeEldestEntry(java.util.Map.Entry<K, V> eldest) return size()>this.maxElements;代碼:/* 創(chuàng)建一個容器(隊(duì)列容器)* 1)數(shù)據(jù)結(jié)構(gòu):數(shù)組(線性結(jié)構(gòu))* 2)算法:FIFO*/class ArrayContainer<T>/*通過數(shù)組元素*/private Object array

溫馨提示

  • 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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論