




已閱讀5頁,還剩43頁未讀, 繼續(xù)免費(fèi)閱讀
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
Java基礎(chǔ) J2SE(3),新一站開發(fā)部 孟凡軍,目錄,Java語言,Java語法,Java進(jìn)階,2,內(nèi)容大綱,程序員應(yīng)知破窗與童子軍軍規(guī) 代碼規(guī)范 設(shè)計模式 中文編碼 泛型、反射 線程池 正則表達(dá)式 加解密,程序員應(yīng)知破窗與童子軍軍規(guī),程序員應(yīng)知破窗與童子軍軍規(guī),代碼規(guī)范,Java 編碼規(guī)范: 是常用代碼習(xí)慣 不是語法要求 但是需要嚴(yán)格遵守,代碼規(guī)范,寫干凈整潔的代碼 刪除沒有使用的類引用(Ctrl+Shilft+O) 格式化代碼(Ctrl+Shilft+F) 刪除廢棄的老代碼(Ctrl+D) 請不要在兩個地方出現(xiàn)完全相同的代碼(重用) 命名類,方法,變量慎用簡寫 拆分大的類,大的方法(500, 50) 2、注釋 使用注釋來解釋代碼的意圖,它們不應(yīng)作為代碼的翻譯,編寫高質(zhì)量的代碼從命名入手,編寫高質(zhì)量的代碼從命名入手,設(shè)計模式,設(shè)計模式(Design pattern):是一套被反復(fù)使用、多數(shù)人知曉的、經(jīng)過分類編目的、代碼設(shè)計經(jīng)驗(yàn)的總結(jié)。使用設(shè)計模式是為了可重用代碼、讓代碼更容易被他人理解、保證代碼可靠性。 設(shè)計模式和框架,設(shè)計模式-要素,模式是一條由三個部分組成的通用規(guī)則: 它表示了一個特定環(huán)境、一類問題和一個解決方案之間的關(guān)系。 設(shè)計模式要素 名稱:助記、交流 問題:先決條件 解決方案:了解設(shè)計的組成成分 效果:應(yīng)用的效果、權(quán)衡、影響,為什么要提倡“Design Pattern“呢?,根本原因是為了代碼復(fù)用,增加可維護(hù)性。那么怎么才能實(shí)現(xiàn)代碼復(fù)用呢?OO界有前輩的幾個原則:“開閉“原則(Open Closed Principal)、里氏代換原則、合成復(fù)用原則。設(shè)計模式就是實(shí)現(xiàn)了這些原則,從而達(dá)到了代碼復(fù)用、增加可維護(hù)性的目的。,設(shè)計模式-原則,1、“開閉“原則 2、里氏代換原則 3、合成復(fù)用原則 4、依賴倒轉(zhuǎn)原則 5、接口隔離原則 6、抽象類 7、迪米特法則,常用的設(shè)計模式,單例模式 簡單工廠模式 代理模式 策略模式 觀察者模式 模板方法模式 職責(zé)鏈模式 裝飾模式 工廠方法模式,設(shè)計模式-書,中文編碼,為什么要編碼? 常見的有 ASCII、ISO-8859-1、GB2312、GBK、UTF-8、UTF-16 幾種編碼格式的比較 GB2312 與 GBK UTF-16 與 UTF-8,編碼轉(zhuǎn)換,I/O 操作中存在的編碼 InputStreamReader 、OutputStreamWriter 內(nèi)存中操作中的編碼:字符到字節(jié)的數(shù)據(jù)類型的轉(zhuǎn)換,常見問題分析,中文變成了看不懂的字符 字符串在解碼與編碼字符集不一致導(dǎo)致漢字變成了看不懂的亂碼,而且是一個漢字字符變成兩個亂碼字符。 一個漢字變成一個問號 將中文和中文符號經(jīng)過不支持中文的ISO-8859-1編碼后,所有字符變成了“?”,這是因?yàn)橛?ISO-8859-1 進(jìn)行編解碼時遇到不在碼值范圍內(nèi)的字符時統(tǒng)一用 3f 表示,這也就是通常所說的“黑洞”,所有 ISO-8859-1 不認(rèn)識的字符都變成了“?”。 一個漢字變成兩個問號 中文經(jīng)過多次編碼,但是其中有一次編碼或者解碼不對仍然會出現(xiàn)中文字符變成“?”現(xiàn)象。,內(nèi)容回顧,程序員應(yīng)知破窗與童子軍軍規(guī) 代碼規(guī)范 設(shè)計模式 中文編碼,泛型、反射,Java泛型 理解Java泛型 應(yīng)用Java泛型編程 Java反射機(jī)制 理解Java反射機(jī)制 理解Java的動態(tài)代理,自學(xué)內(nèi)容,熟悉設(shè)計模式應(yīng)用場景 編碼規(guī)范 中文編碼轉(zhuǎn)換,Java泛型,在Java SE 1.5之前,沒有泛型的情況的下,通過對類型Object的引用來實(shí)現(xiàn)參數(shù)的“任意化”; 泛型是Java SE 1.5的新特性,泛型的本質(zhì)是參數(shù)化類型,也就是說所操作的數(shù)據(jù)類型被指定為一個參數(shù)。這種參數(shù)類型可以用在類、接口和方法的創(chuàng)建中,分別稱為泛型類、泛型接口、泛型方法。,Java泛型:規(guī)則和限制,Java泛型:泛型類語法,泛型類的語法說明: 使用來聲明一個類型持有者名稱,就可以把T當(dāng)作一個類型代表來聲明成員、參數(shù)和返回值類型。T僅僅是個名字,這個名字可以自定義。 聲明 class GenericsFoo 聲明了一個泛型類,這個T沒有任何限制,實(shí)際上相當(dāng)于Object類型,實(shí)際上相當(dāng)于 class GenericsFoo。 使用 與Object泛型類相比,使用泛型所定義的類在聲明和構(gòu)造實(shí)例的時候,可以使用“”來一并指定泛型類型持有者的真實(shí)類型。比如 GenericsFoo douFoo=new GenericsFoo(new Double(“33“); 當(dāng)然,也可以在構(gòu)造對象的時候不使用尖括號指定泛型類型的真實(shí)類型,但是你在使用該對象的時候,就需要強(qiáng)制轉(zhuǎn)換了。比如: GenericsFoo douFoo=new GenericsFoo(new Double(“33“); 實(shí)際上,當(dāng)構(gòu)造對象時不指定類型信息的時候,默認(rèn)會使用Object類型,這也是要強(qiáng)制轉(zhuǎn)換的原因。,Java泛型應(yīng)用示例,/* * DAO操作基類 : 本DAO層實(shí)現(xiàn)了通用的數(shù)據(jù)操作 * param POJO實(shí)體對象 * param ID */ public class BaseHibernateDAOImpl extends HibernateDaoSupport implements BaseHibernateDao private Class entityClass; public void setEntityClass(Class entityClass) this.entityClass = entityClass; ,Java語言的反射機(jī)制,在 Java 運(yùn)行時環(huán)境中,對于任意一個類,能否知道這個類有哪些屬性和方法?對于任意一個對象,能否調(diào)用它的任意一個方法?答案是肯定的。這種動態(tài)獲取類的信息,以及動態(tài)調(diào)用對象的方法的功能來自于Java 語言的反射(Reflection)機(jī)制。 Java 反射機(jī)制主要提供了以下功能: 在運(yùn)行時判斷任意一個對象所屬的類; 在運(yùn)行時構(gòu)造任意一個類的對象; 在運(yùn)行時判斷任意一個類所具有的成員變量和方法; 在運(yùn)行時調(diào)用任意一個對象的方法; 生成動態(tài)代理。,Java Reflection API,在 JDK 中,主要由以下類來實(shí)現(xiàn)Java 反射機(jī)制,這些類都位于java.lang.reflect包中: Java.lang.Class類:代表一個類。 Field類:代表類的成員變量(成員變量也稱為類的屬性)。 Method類:代表類的方法。 Constructor 類:代表類的構(gòu)造方法。 Array類:提供了動態(tài)創(chuàng)建數(shù)組,以及訪問數(shù)組元素的靜態(tài)方法。,Java Reflection API,Java Reflection API,Method類的invoke(Object obj, Object args)方法用于動態(tài)執(zhí)行一個對象的特定方法。 第一個obj 參數(shù)指定具有該方法的對象; 第二個args 參數(shù)指定向該方法傳遞的參數(shù),該參數(shù)必須為對象,如果參數(shù)為基本類型數(shù)據(jù),必須轉(zhuǎn)換為相應(yīng)的包裝類型的對象; invoke()方法的返回值總是對象,如果實(shí)際被調(diào)用的方法的返回類型是基本類型數(shù)據(jù),那么invoke()方法會把它轉(zhuǎn)換為相應(yīng)的包裝類型的對象,再將其返回。,代理模式,代理模式是常用的Java 設(shè)計模式,它的特征是代理類與委托類有同樣的接口。代理類主要負(fù)責(zé)為委托類預(yù)處理消息、過濾消息、把消息轉(zhuǎn)發(fā)給委托類,以及事后處理消息等。代理類與委托類之間通常會存在關(guān)聯(lián)關(guān)系,一個代理類的對象與一個委托類的對象關(guān)聯(lián),代理類的對象本身并不真正實(shí)現(xiàn)服務(wù),而是通過調(diào)用委托類的對象的相關(guān)方法,來提供特定的服務(wù)。 按照代理類的創(chuàng)建時期,代理類可分為兩種。 靜態(tài)代理類:由程序員創(chuàng)建或由特定工具自動生成源代碼,再對其編譯。在程序運(yùn)行前,代理類的.class文件就已經(jīng)存在了。 動態(tài)代理類:在程序運(yùn)行時,運(yùn)用反射機(jī)制動態(tài)創(chuàng)建而成。 圖: 代理模式,靜態(tài)代理類,如圖a所示,HelloServiceProxy 類是代理類,HelloServiceImpl類是委托類,這兩個類都實(shí)現(xiàn)了HelloService接口。其中HelloServiceImpl類是HelloService接口的真正實(shí)現(xiàn)者,而HelloServiceProxy類是通過調(diào)用HelloServiceImpl 類的相關(guān)方法來提供特定服務(wù)的。HelloServiceProxy類的echo()方法和getTime()方法會分別調(diào)用被代理的HelloServiceImpl 對象的echo()方法和getTime()方法,并且在方法調(diào)用前后都會執(zhí)行一些簡單的打印操作。由此可見,代理類可以為委托類預(yù)處理消息、把消息轉(zhuǎn)發(fā)給委托類和事后處理消息等。 圖a:HelloServiceProxy是HelloService的代理類 圖b:調(diào)用時序圖,動態(tài)代理類,動態(tài)代理類的字節(jié)碼在程序運(yùn)行時由Java反射機(jī)制動態(tài)生成,無需程序員手工編寫它的源代碼。動態(tài)代理類不僅簡化了編程工作,而且提高了軟件系統(tǒng)的可擴(kuò)展性,因?yàn)镴ava 反射機(jī)制可以生成任意類型的動態(tài)代理類。java.lang.reflect 包中的Proxy類和InvocationHandler 接口提供了生成動態(tài)代理類的能力。 Proxy類提供了創(chuàng)建動態(tài)代理類及其實(shí)例的靜態(tài)方法: public static Class getProxyClass(ClassLoader loader, Class interfaces) throws IllegalArgumentException 該靜態(tài)方法負(fù)責(zé)創(chuàng)建動態(tài)代理類。參數(shù)loader 指定動態(tài)代理類的類加載器,參數(shù)interfaces 指定動態(tài)代理類需要實(shí)現(xiàn)的所有接口。 public static Object newProxyInstance( ClassLoader loader, Class interfaces, InvocationHandler handler) throws IllegalArgumentException 該靜態(tài)方法負(fù)責(zé)創(chuàng)建動態(tài)代理類的實(shí)例。參數(shù)loader 指定動態(tài)代理類的類加載器,參數(shù)interfaces 指定動態(tài)代理類需要實(shí)現(xiàn)的所有接口,參數(shù)handler 指定與動態(tài)代理類關(guān)聯(lián)的InvocationHandler 對象。,動態(tài)代理類,以下兩種方式都創(chuàng)建了實(shí)現(xiàn)Foo接口的動態(tài)代理類的實(shí)例: /* 方式一*/ /創(chuàng)建InvocationHandler對象 InvocationHandler handler = new MyInvocationHandler(.); /創(chuàng)建動態(tài)代理類 Class proxyClass = Proxy.getProxyClass(Foo.class.getClassLoader(), new Class Foo.class ); /創(chuàng)建動態(tài)代理類的實(shí)例 Foo foo = (Foo) proxyClass.getConstructor(new Class InvocationHandler.class ).newInstance(new Object handler ); /* 方式二*/ /創(chuàng)建InvocationHandler對象 InvocationHandler handler = new MyInvocationHandler(.); /直接創(chuàng)建動態(tài)代理類的實(shí)例 Foo foo = (Foo) Proxy.newProxyInstance(Foo.class.getClassLoader(), new Class Foo.class , handler);,動態(tài)代理類,由Proxy類的靜態(tài)方法創(chuàng)建的動態(tài)代理類具有以下特點(diǎn): 動態(tài)代理類是public、final和非抽象類型的; 動態(tài)代理類繼承了java.lang.reflect.Proxy類; 動態(tài)代理類的名字以“$Proxy”開頭; 動態(tài)代理類實(shí)現(xiàn)getProxyClass()和newProxyInstance()方法中參數(shù)interfaces指定的所有接口; Proxy 類的isProxyClass(Class cl)靜態(tài)方法可用來判斷參數(shù)指定的類是否為動態(tài)代理類。只有通過Proxy類創(chuàng)建的類才是動態(tài)代理類; 動態(tài)代理類都具有一個public 類型的構(gòu)造方法,該構(gòu)造方法有一個InvocationHandler 類型的參數(shù)。 InvocationHandler 接口為方法調(diào)用接口,它聲明了負(fù)責(zé)調(diào)用任意一個方法的invoke()方法: Object invoke(Object proxy,Method method,Object args) throws Throwable 參數(shù)proxy指定動態(tài)代理類實(shí)例,參數(shù)method指定被調(diào)用的方法,參數(shù)args 指定向被調(diào)用方法傳遞的參數(shù),invoke()方法的返回值表示被調(diào)用方法的返回值。,動態(tài)代理類,圖1: HelloServiceProxyFactory創(chuàng)建動態(tài)代理類實(shí)例 圖2: 動態(tài)類實(shí)例調(diào)用時序圖,內(nèi)置的高效的線程池,JDK1.5已經(jīng)內(nèi)置了高效的通用的線程池。 一段示范代碼: ThreadPoolExecutor threadPool = new ThreadPoolExecutor(10, 1000, 30, TimeUnit.SECONDS, new ArrayBlockingQueue(3), new ThreadPoolExecutor.DiscardOldestPolicy(); while(接收請求) threadPool.execute(new WorkerThread(XXX); 上面這段代碼首先生成一個初始化為10個,最大為1000個線程的線程池,每次接收請求的時候,都從線程程中抽出一個線程來運(yùn)行,內(nèi)置的高效的線程池,對于一個并發(fā)程序來說,線程池可說是其中一個比較重要的部分。尤其是對各種Socket Server來講,其流程一般都是:接收客戶端請求處理邏輯將結(jié)果返回給客戶端。處理邏輯那段,經(jīng)常要用到多線程(或多進(jìn)程)。一般有以下兩種實(shí)現(xiàn): 1、每次請求都生成一個新的線程(或進(jìn)程)去處理。 2、每次請求到來,從線程池(進(jìn)程池)中取出一個,然后讓其處理。 在以前,線程池只能是自己重新發(fā)明車輪去寫,或者從網(wǎng)上找第三方的線程池(質(zhì)量很難得到保證),內(nèi)置的高效的線程池,Runnable,Callable和Future Runnable這個接口我們已經(jīng)非常熟悉,它代表線程的執(zhí)行,里面有一個run方法。但是它是沒辦法返回線程的執(zhí)行結(jié)果的(當(dāng)然,通過間接的方法可以)。JDK1.5新增了一個Callable接口,和Runnable類似,只是里面的call方法是可以返回線程的執(zhí)行結(jié)果的。 Future這個接口則是描述異步運(yùn)算的結(jié)果,里面的方法: cancel(boolean mayInterruptIfRunning): 取消該次執(zhí)行 get():等待并獲取運(yùn)算結(jié)果 get(long timeout, TimeUnit unit):等待一定時間獲取運(yùn)算結(jié)果 isCancelled():判斷任務(wù)是否已經(jīng)取消 isDone():判斷任務(wù)是否已經(jīng)完成 這三個接口構(gòu)成了線程池的基礎(chǔ)。,內(nèi)置的高效的線程池,一個具體的例子: class MatchCounter implements Callable public MatchCounter(File directory, String keyword) . . . public Integer call() . . . / returns the number of matching files FutureTask task = new FutureTask(counter); Thread t = new Thread(task); t.start(); System.out.println(task.get() + “ matching files.“);,內(nèi)置的高效的線程池,線程池的一個實(shí)現(xiàn):ThreadPoolExecutor,它實(shí)現(xiàn)了線程池的各方面的功能,如: 執(zhí)行某個任務(wù)(返回或不返回結(jié)果)。 初始化一定數(shù)量的線程,隨著負(fù)荷的增大而新建線程,并控制線程池的最大容量。 在線程執(zhí)行之前和之后執(zhí)行一段代碼。 刪除某個任務(wù)。 關(guān)閉整個線程池。 獲取線程池運(yùn)行的各個運(yùn)行期參數(shù) ,非常齊備,從此不再需要每次都重新發(fā)明車輪。,內(nèi)置的高效的線程池,ThreadPoolExecutor的一些常用方法: ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue workQueue, RejectedExecutionHandler handler) 這是其中一個構(gòu)造函數(shù),第一個參數(shù)是常駐的線程數(shù),第二個參數(shù)為線
溫馨提示
- 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 煙臺大學(xué)《DSP芯片及應(yīng)用》2023-2024學(xué)年第二學(xué)期期末試卷
- 東莞城市學(xué)院《人力資源管理導(dǎo)論》2023-2024學(xué)年第二學(xué)期期末試卷
- 上海濟(jì)光職業(yè)技術(shù)學(xué)院《CFA衍生品II》2023-2024學(xué)年第二學(xué)期期末試卷
- 河北北方學(xué)院《工程地質(zhì)與土力學(xué)》2023-2024學(xué)年第二學(xué)期期末試卷
- 江蘇科技大學(xué)蘇州理工學(xué)院《工程機(jī)械運(yùn)用與維護(hù)》2023-2024學(xué)年第二學(xué)期期末試卷
- 華北科技學(xué)院《俄語IV》2023-2024學(xué)年第二學(xué)期期末試卷
- 洛陽師范學(xué)院《高級朝鮮語》2023-2024學(xué)年第二學(xué)期期末試卷
- 陜西青年職業(yè)學(xué)院《電工與電子技術(shù)基礎(chǔ)》2023-2024學(xué)年第二學(xué)期期末試卷
- 中國民用航空飛行學(xué)院《工程結(jié)構(gòu)抗震設(shè)計》2023-2024學(xué)年第二學(xué)期期末試卷
- 云南交通職業(yè)技術(shù)學(xué)院《物流與電子商務(wù)實(shí)驗(yàn)》2023-2024學(xué)年第二學(xué)期期末試卷
- 2024-2025年全國初中化學(xué)競賽試卷及答案
- 2024年山東濟(jì)南先行投資有限責(zé)任公司招聘筆試參考題庫含答案解析
- 企業(yè)的經(jīng)營指標(biāo)分析報告
- 故事繪本表演游戲-:狐貍和兔子
- 教師技能大賽領(lǐng)導(dǎo)講話稿
- 遺囑繼承法律知識講座
- 腸系膜上動脈壓迫綜合征演示稿件
- 四年級上冊語文園地七教學(xué)反思
- 企業(yè)員工法律意識培訓(xùn)課件
- 屋面防水維修工程投標(biāo)方案(技術(shù)標(biāo))
- 甲烷-安全技術(shù)說明書MSDS
評論
0/150
提交評論