




版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、高級(jí)軟件人才實(shí)作培訓(xùn)專(zhuān)家高級(jí)軟件人才實(shí)作培訓(xùn)專(zhuān)家! !北京傳智播客教育 JavaJava基礎(chǔ)加強(qiáng)基礎(chǔ)加強(qiáng)方立勛方立勛高級(jí)軟件人才實(shí)作培訓(xùn)專(zhuān)家高級(jí)軟件人才實(shí)作培訓(xùn)專(zhuān)家! !Eclipse的使用l工作空間(workspace)、工程(project)l在eclipse下Java程序的編寫(xiě)和運(yùn)行,及java運(yùn)行環(huán)境的配置。l快捷鍵的配置,常用快捷鍵:內(nèi)容提示:Alt + / 快速修復(fù):Ctrl + 1導(dǎo)包:Ctrl + shift + O格式化代碼塊:ctrl + shift + F向前向后:Alt + 方向鍵添加注釋 Ctrl+Shift+/除去注釋 Ctrl+Shift+l程序的調(diào)試和運(yùn)行F5(
2、跳入) F6(跳過(guò)) F7(跳出)lJunit高級(jí)軟件人才實(shí)作培訓(xùn)專(zhuān)家高級(jí)軟件人才實(shí)作培訓(xùn)專(zhuān)家! !JDK 5.0 新特性lJDK5中新增了很多新的java特性,利用這些新語(yǔ)法可以幫助開(kāi)發(fā)人員編寫(xiě)出更加高效、清晰,安全的代碼。 靜態(tài)導(dǎo)入自動(dòng)裝箱/拆箱增強(qiáng)for循環(huán)可變參數(shù)枚舉泛型元數(shù)據(jù)高級(jí)軟件人才實(shí)作培訓(xùn)專(zhuān)家高級(jí)軟件人才實(shí)作培訓(xùn)專(zhuān)家! !靜態(tài)導(dǎo)入靜態(tài)導(dǎo)入lJDK 1.5 增加的靜態(tài)導(dǎo)入語(yǔ)法用于導(dǎo)入類(lèi)的某個(gè)靜態(tài)屬性或方法。使用靜態(tài)導(dǎo)入可以簡(jiǎn)化程序?qū)︻?lèi)靜態(tài)屬性和方法的調(diào)用。l語(yǔ)法:Import static 包名.類(lèi)名.靜態(tài)屬性|靜態(tài)方法|*l例如:import static java.lang.
3、System.outimport static java.lang.Math.*高級(jí)軟件人才實(shí)作培訓(xùn)專(zhuān)家高級(jí)軟件人才實(shí)作培訓(xùn)專(zhuān)家! !自動(dòng)裝箱自動(dòng)裝箱/ /拆箱拆箱lJDK5.0的語(yǔ)法允許開(kāi)發(fā)人員把一個(gè)基本數(shù)據(jù)類(lèi)型直接賦給對(duì)應(yīng)的包裝類(lèi)變量, 或者賦給 Object 類(lèi)型的變量,這個(gè)過(guò)程稱(chēng)之為自動(dòng)裝箱。l自動(dòng)拆箱與自動(dòng)裝箱與之相反,即把包裝類(lèi)對(duì)象直接賦給一個(gè)對(duì)應(yīng)的基本類(lèi)型變量。l典型應(yīng)用:List list = new ArrayList();list.add(1);int j = (Integer)list.get(0);高級(jí)軟件人才實(shí)作培訓(xùn)專(zhuān)家高級(jí)軟件人才實(shí)作培訓(xùn)專(zhuān)家! !增強(qiáng)for循環(huán)l引
4、入增強(qiáng)for循環(huán)的原因:在JDK5以前的版本中,遍歷數(shù)組或集合中的元素,需先獲得數(shù)組的長(zhǎng)度或集合的迭代器,比較麻煩!l因此JDK5中定義了一種新的語(yǔ)法增強(qiáng)for循環(huán),以簡(jiǎn)化此類(lèi)操作。增強(qiáng)for循環(huán)只能用在數(shù)組數(shù)組、或?qū)崿F(xiàn)實(shí)現(xiàn)Iterator接口接口的集合類(lèi)上l語(yǔ)法格式: for(變量類(lèi)型 變量:需迭代的數(shù)組或集合)高級(jí)軟件人才實(shí)作培訓(xùn)專(zhuān)家高級(jí)軟件人才實(shí)作培訓(xùn)專(zhuān)家! !增強(qiáng)for循環(huán)l使用增強(qiáng)for循環(huán)的幾個(gè)注意事項(xiàng)(以下程序的輸出結(jié)果?)int arr = new int5;for(int num : arr)num = 1;System.out.println(arr0);List list
5、 = new ArrayList();list.add(xxx);for(String str : list)str = yyy;System.out.println(list.get(0);高級(jí)軟件人才實(shí)作培訓(xùn)專(zhuān)家高級(jí)軟件人才實(shí)作培訓(xùn)專(zhuān)家! !可變參數(shù)l測(cè)試JDK中具有可變參數(shù)的類(lèi)Arrays.asList()方法。分別傳多個(gè)參、傳數(shù)組,傳數(shù)組又傳參的情況。注意:傳入基本數(shù)據(jù)類(lèi)型數(shù)組的問(wèn)題。l從JDK 5開(kāi)始, Java 允許為方法定義長(zhǎng)度可變的參數(shù)。語(yǔ)法:public void foo(int args)l注意事項(xiàng):調(diào)用可變參數(shù)的方法時(shí), 編譯器將自動(dòng)創(chuàng)建一個(gè)數(shù)組保存?zhèn)鬟f給方法的可變參數(shù),
6、因此,程序員可以在方法體中以數(shù)組的形式訪問(wèn)可變參數(shù)可變參數(shù)只能處于參數(shù)列表的最后, 所以一個(gè)方法最多只能有一個(gè)長(zhǎng)度可變的參數(shù)高級(jí)軟件人才實(shí)作培訓(xùn)專(zhuān)家高級(jí)軟件人才實(shí)作培訓(xùn)專(zhuān)家! !枚舉類(lèi)l為什么需要枚舉?一些方法在運(yùn)行時(shí),它需要的數(shù)據(jù)不能是任意的,而必須是一定范圍內(nèi)的值,此類(lèi)問(wèn)題在JDK5以前采用自定義帶有枚舉功能的類(lèi)解決,Java5以后可以直接使用枚舉予以解決。lJDK 5新增的 enum 關(guān)鍵字用于定義一個(gè)枚舉類(lèi)。高級(jí)軟件人才實(shí)作培訓(xùn)專(zhuān)家高級(jí)軟件人才實(shí)作培訓(xùn)專(zhuān)家! !枚舉類(lèi)l枚舉類(lèi)具有如下特性:枚舉類(lèi)也是一種特殊形式的Java類(lèi)。枚舉類(lèi)中聲明的每一個(gè)枚舉值代表枚舉類(lèi)的一個(gè)實(shí)例對(duì)象。與java
7、中的普通類(lèi)一樣,在聲明枚舉類(lèi)時(shí),也可以聲明屬性、方法和構(gòu)造函數(shù),但枚舉類(lèi)的構(gòu)造函數(shù)必須為私有的(這點(diǎn)不難理解)。枚舉類(lèi)也可以實(shí)現(xiàn)接口、或繼承抽象類(lèi)。JDK5中擴(kuò)展了swith語(yǔ)句,它除了可以接收int, byte, char, short外,還可以接收一個(gè)枚舉類(lèi)型。若枚舉類(lèi)只有一個(gè)枚舉值,則可以當(dāng)作單態(tài)設(shè)計(jì)模式使用。l練習(xí):請(qǐng)編寫(xiě)一個(gè)關(guān)于星期幾的枚舉WeekDay,要求:枚舉值:Mon,Tue,Wed,Thu,Fri,Sat,Sun 該枚舉要有一個(gè)方法,調(diào)用該方法返回中文格式的星期。高級(jí)軟件人才實(shí)作培訓(xùn)專(zhuān)家高級(jí)軟件人才實(shí)作培訓(xùn)專(zhuān)家! !枚舉類(lèi)lJava中聲明的枚舉類(lèi),均是java.lang.E
8、num類(lèi)的孩子,它繼承了Enum類(lèi)的所有方法。常用方法:name()ordinal()valueof(Class enumClass, String name)values() 此方法雖然在JDK文檔中查找不到,但每個(gè)枚舉類(lèi)都具有該方法,它遍歷枚舉類(lèi)的所有枚舉值非常方便。高級(jí)軟件人才實(shí)作培訓(xùn)專(zhuān)家高級(jí)軟件人才實(shí)作培訓(xùn)專(zhuān)家! !反射反射l什么是反射?反射就是把Java類(lèi)中的各種成分映射成一個(gè)個(gè)的java對(duì)象。例如,一個(gè)類(lèi)有:成員變量,方法,構(gòu)造方法,包等等信息,利用反射技術(shù)可以對(duì)一個(gè)類(lèi)進(jìn)行解剖,把各個(gè)組成部分映射成一個(gè)個(gè)對(duì)象。l反射用在哪里?l學(xué)習(xí)反射應(yīng)該掌握些什么?高級(jí)軟件人才實(shí)作培訓(xùn)專(zhuān)家高級(jí)軟
9、件人才實(shí)作培訓(xùn)專(zhuān)家! !ClassClass類(lèi)類(lèi)lClass類(lèi)用于表示.class文件,畫(huà)圖演示一個(gè)對(duì)象的創(chuàng)建過(guò)程。l如何得到某個(gè)class文件對(duì)應(yīng)的class對(duì)象。類(lèi)名.class,對(duì)象.getClass()Class.forName(“類(lèi)名”) l數(shù)組類(lèi)型的Class實(shí)例對(duì)象Class.isArray()l總之,只要是在源程序中出現(xiàn)的類(lèi)型,都有各自的Class實(shí)例對(duì)象,例如,int,void高級(jí)軟件人才實(shí)作培訓(xùn)專(zhuān)家高級(jí)軟件人才實(shí)作培訓(xùn)專(zhuān)家! !ConstructorConstructor類(lèi)類(lèi)lConstructor類(lèi)的實(shí)例對(duì)象代表類(lèi)的一個(gè)構(gòu)造方法。類(lèi)的實(shí)例對(duì)象代表類(lèi)的一個(gè)構(gòu)造方法。l得到某
10、個(gè)類(lèi)所有的構(gòu)造方法,例:得到某個(gè)類(lèi)所有的構(gòu)造方法,例:Constructor constructors= Class.forName(java.lang.String).getConstructors();l得到某一個(gè)構(gòu)造方法,例:得到某一個(gè)構(gòu)造方法,例: Constructor constructor = Class.forName(“java.lang.String”).getConstructor(StringBuffer.class);l利用構(gòu)造方法創(chuàng)建實(shí)例對(duì)象:利用構(gòu)造方法創(chuàng)建實(shí)例對(duì)象:String str = (String)constructor.newInstance(“abc
11、”);lClass類(lèi)的類(lèi)的newInstance()方法也可創(chuàng)建類(lèi)的實(shí)例,其內(nèi)部工作原理方法也可創(chuàng)建類(lèi)的實(shí)例,其內(nèi)部工作原理是先得無(wú)參的構(gòu)造方法,再用構(gòu)造方法創(chuàng)建實(shí)例對(duì)象。是先得無(wú)參的構(gòu)造方法,再用構(gòu)造方法創(chuàng)建實(shí)例對(duì)象。String obj =(String)Class.forName(java.lang.String).newInstance();高級(jí)軟件人才實(shí)作培訓(xùn)專(zhuān)家高級(jí)軟件人才實(shí)作培訓(xùn)專(zhuān)家! !FieldField類(lèi)類(lèi)lField類(lèi)類(lèi)代表某個(gè)類(lèi)中的一個(gè)成員變量l問(wèn)題:得到的Field對(duì)象是對(duì)應(yīng)到類(lèi)上面的成員變量,還是對(duì)應(yīng)到對(duì)象上的成員變量?類(lèi)只有一個(gè),而該類(lèi)的實(shí)例對(duì)象有多個(gè),如果是與對(duì)
12、象關(guān)聯(lián),哪關(guān)聯(lián)的是哪個(gè)對(duì)象呢?所以字段fieldX 代表的是x的定義,而不是具體的x變量。(注意訪問(wèn)權(quán)限的問(wèn)題)l示例代碼:ReflectPoint point = new ReflectPoint(1,7);Field y = Class.forName(cn.itcast.corejava.ReflectPoint).getField(y);System.out.println(y.get(point);/Field x = Class.forName(cn.itcast.corejava.ReflectPoint).getField(x);Field x = Class.forName(
13、cn.itcast.corejava.ReflectPoint).getDeclaredField(x);x.setAccessible(true);System.out.println(x.get(point);高級(jí)軟件人才實(shí)作培訓(xùn)專(zhuān)家高級(jí)軟件人才實(shí)作培訓(xùn)專(zhuān)家! !MethodMethod類(lèi)類(lèi)lMethod類(lèi)類(lèi)代表某個(gè)類(lèi)中的一個(gè)成員方法l得到類(lèi)中的某一個(gè)方法:例子: Method charAt = Class.forName(java.lang.String).getMethod(charAt, int.class);l調(diào)用方法:通常方式:System.out.println(str.cha
14、rAt(1);反射方式: System.out.println(charAt.invoke(str, 1); 如果傳遞給Method對(duì)象的invoke()方法的第一個(gè)參數(shù)為null,這有著什么樣的意義呢?說(shuō)明該Method對(duì)象對(duì)應(yīng)的是一個(gè)靜態(tài)方法!ljdk1.4和jdk1.5的invoke方法的區(qū)別:Jdk1.5:public Object invoke(Object obj,Object. args)Jdk1.4:public Object invoke(Object obj,Object args),即按jdk1.4的語(yǔ)法,需要將一個(gè)數(shù)組作為參數(shù)傳遞給invoke方法時(shí),數(shù)組中的每個(gè)元素分
15、別對(duì)應(yīng)被調(diào)用方法中的一個(gè)參數(shù),所以,調(diào)用charAt方法的代碼也可以用Jdk1.4改寫(xiě)為 charAt.invoke(“str”, new Object1)形式。高級(jí)軟件人才實(shí)作培訓(xùn)專(zhuān)家高級(jí)軟件人才實(shí)作培訓(xùn)專(zhuān)家! !用反射方式執(zhí)行某個(gè)類(lèi)中的用反射方式執(zhí)行某個(gè)類(lèi)中的mainmain方法方法l目標(biāo):目標(biāo):寫(xiě)一個(gè)程序,這個(gè)程序能夠根據(jù)用戶提供的類(lèi)名,去執(zhí)行該類(lèi)中的main方法。用普通方式調(diào)完后,大家要明白為什么要用反射方式去調(diào)?。縧問(wèn)題:?jiǎn)栴}:?jiǎn)?dòng)Java程序的main方法的參數(shù)是一個(gè)字符串?dāng)?shù)組,即public static void main(String args),通過(guò)反射方式來(lái)調(diào)用這個(gè)mai
16、n方法時(shí),如何為invoke方法傳遞參數(shù)呢?按jdk1.5的語(yǔ)法,整個(gè)數(shù)組是一個(gè)參數(shù),而按jdk1.4的語(yǔ)法,數(shù)組中的每個(gè)元素對(duì)應(yīng)一個(gè)參數(shù),當(dāng)把一個(gè)字符串?dāng)?shù)組作為參數(shù)傳遞給invoke方法時(shí),javac會(huì)到底按照哪種語(yǔ)法進(jìn)行處理呢?jdk1.5肯定要兼容jdk1.4的語(yǔ)法,會(huì)按jdk1.4的語(yǔ)法進(jìn)行處理,即把數(shù)組打散成為若干個(gè)單獨(dú)的參數(shù)。所以,在給main方法傳遞參數(shù)時(shí),不能使用代碼mainMethod.invoke(null,new String“xxx”),javac只把它當(dāng)作jdk1.4的語(yǔ)法進(jìn)行理解,而不把它當(dāng)作jdk1.5的語(yǔ)法解釋?zhuān)虼藭?huì)出現(xiàn)參數(shù)類(lèi)型不對(duì)的問(wèn)題。l解決辦法:解決辦法
17、:mainMethod.invoke(null,new Objectnew Stringxxx);mainMethod.invoke(null,(Object)new Stringxxx); ,編譯器會(huì)作特殊處理,編譯時(shí)不把參數(shù)當(dāng)作數(shù)組看待,也就不會(huì)數(shù)組打散成若干個(gè)參數(shù)了高級(jí)軟件人才實(shí)作培訓(xùn)專(zhuān)家高級(jí)軟件人才實(shí)作培訓(xùn)專(zhuān)家! !內(nèi)省(Introspector) JavaBeanl什么是JavaBean和屬性的讀寫(xiě)方法?l訪問(wèn)JavaBean屬性的兩種方式:直接調(diào)用bean的setXXX或getXXX方法。通過(guò)內(nèi)省技術(shù)訪問(wèn)(java.beans包提供了內(nèi)省的API),內(nèi)省技術(shù)訪問(wèn)也提供了兩種方式。通
18、過(guò)PropertyDescriptor類(lèi)操作Bean的屬性通過(guò)Introspector類(lèi)獲得Bean對(duì)象的 BeanInfo,然后通過(guò) BeanInfo 來(lái)獲取屬性的描述器( PropertyDescriptor ),通過(guò)這個(gè)屬性描述器就可以獲取某個(gè)屬性對(duì)應(yīng)的 getter/setter 方法,然后通過(guò)反射機(jī)制來(lái)調(diào)用這些方法。高級(jí)軟件人才實(shí)作培訓(xùn)專(zhuān)家高級(jí)軟件人才實(shí)作培訓(xùn)專(zhuān)家! !內(nèi)省beanutils工具包 lApache組織開(kāi)發(fā)了一套用于操作JavaBean的API,這套API考慮到了很多實(shí)際開(kāi)發(fā)中的應(yīng)用場(chǎng)景,因此在實(shí)際開(kāi)發(fā)中很多程序員使用這套API操作JavaBean,以簡(jiǎn)化程序代碼的編寫(xiě)
19、。lBeanutils工具包的常用類(lèi):BeanUtilsPropertyUtilsConvertUtils.regsiter(Converter convert, Class clazz)自定義轉(zhuǎn)換器高級(jí)軟件人才實(shí)作培訓(xùn)專(zhuān)家高級(jí)軟件人才實(shí)作培訓(xùn)專(zhuān)家! !泛型(Generic)泛形的作用lJDK5以前,對(duì)象保存到集合中就會(huì)失去其特性,取出時(shí)通常要程序員手工進(jìn)行類(lèi)型的強(qiáng)制轉(zhuǎn)換,這樣不可避免就會(huì)引發(fā)程序的一些安全性問(wèn)題。例如:ArrayList list = new ArrayList();list.add(abc);Integer num = (Integer) list.get(0); /運(yùn)行時(shí)
20、會(huì)出錯(cuò),但編碼時(shí)發(fā)現(xiàn)不了list.add(new Random();list.add(new ArrayList();for(int i=0;ilist.size();i+)(?)list.get(i); /此處取出來(lái)的對(duì)象應(yīng)轉(zhuǎn)換成什么類(lèi)型高級(jí)軟件人才實(shí)作培訓(xùn)專(zhuān)家高級(jí)軟件人才實(shí)作培訓(xùn)專(zhuān)家! !泛型(Generic) 泛形的作用lJDK5中的泛形允許程序員在編寫(xiě)集合代碼時(shí),就限制集合的處理類(lèi)型,從而把原來(lái)程序運(yùn)行時(shí)可能發(fā)生問(wèn)題,轉(zhuǎn)變?yōu)榫幾g時(shí)的問(wèn)題,以此提高程序的可讀性和穩(wěn)定性(尤其在大型程序中更為突出)。l注意:泛型是提供給javac編譯器使用的,它用于限定集合的輸入類(lèi)型,讓編譯器在源代碼級(jí)別上
21、,即擋住向集合中插入非法數(shù)據(jù)。但編譯器編譯完帶有泛形的java程序后,生成的class文件中將不再帶有泛形信息,以此使程序運(yùn)行效率不受到影響,這個(gè)過(guò)程稱(chēng)之為“擦除”。l泛形的基本術(shù)語(yǔ),以ArrayList為例:念著typeofArrayList中的E稱(chēng)為類(lèi)型參數(shù)變量ArrayList中的Integer稱(chēng)為實(shí)際類(lèi)型參數(shù)整個(gè)稱(chēng)為ArrayList泛型類(lèi)型整個(gè)ArrayList稱(chēng)為參數(shù)化的類(lèi)型ParameterizedType 高級(jí)軟件人才實(shí)作培訓(xùn)專(zhuān)家高級(jí)軟件人才實(shí)作培訓(xùn)專(zhuān)家! !泛型典型應(yīng)用l使用迭代器迭代泛形集合中的元素。l使用增強(qiáng)for循環(huán)迭代泛形集合中的元素。l存取HashMap中的元素。l
22、使用泛形時(shí)的幾個(gè)常見(jiàn)問(wèn)題:使用泛形時(shí),泛形類(lèi)型須為引用類(lèi)型,不能是基本數(shù)據(jù)類(lèi)型ArrayList list = new ArrayList();ArrayList list = new ArrayList(); ArrayList list = new ArrayList ();ArrayList list = new ArrayList();高級(jí)軟件人才實(shí)作培訓(xùn)專(zhuān)家高級(jí)軟件人才實(shí)作培訓(xùn)專(zhuān)家! !自定義泛形泛型方法lJava程序中的普通方法、構(gòu)造方法和靜態(tài)方法中都可以使用泛型。方法使用泛形前,必須對(duì)泛形進(jìn)行聲明,語(yǔ)法: ,T可以是任意字母,但通常必須要大寫(xiě)。通常需放在方法的返回值聲明之前。例如
23、:public static void doxx(T t);l練習(xí):編寫(xiě)一個(gè)泛形方法,實(shí)現(xiàn)數(shù)組元素的交換。編寫(xiě)一個(gè)泛形方法,接收一個(gè)任意數(shù)組,并顛倒數(shù)組中的所有元素。l注意:只有對(duì)象類(lèi)型才能作為泛型方法的實(shí)際參數(shù)。在泛型中可以同時(shí)有多個(gè)類(lèi)型,例如:public static V getValue(K key) return map.get(key);高級(jí)軟件人才實(shí)作培訓(xùn)專(zhuān)家高級(jí)軟件人才實(shí)作培訓(xùn)專(zhuān)家! !l如果一個(gè)類(lèi)多處都要用到同一個(gè)泛型,這時(shí)可以把泛形定義在類(lèi)上(即類(lèi)級(jí)別的泛型),語(yǔ)法格式如下:public class GenericDao private T field1;public vo
24、id save(T obj)public T getId(int id)l注意,靜態(tài)方法不能使用類(lèi)定義的泛形,而應(yīng)單獨(dú)定義泛形。l泛形的典型應(yīng)用:BaseDao和反射泛型高級(jí)軟件人才實(shí)作培訓(xùn)專(zhuān)家高級(jí)軟件人才實(shí)作培訓(xùn)專(zhuān)家! !泛型的高級(jí)應(yīng)用通配符l定義一個(gè)方法,接收一個(gè)集合,并打印出集合中的所有元素,如下所示: void print (Collection c) for (String e : c) System.out.println(e); l問(wèn)題:該方法只能打印保存了Object對(duì)象的集合,不能打印其它集合。通配符用于解決此類(lèi)問(wèn)題,方法的定義可改寫(xiě)為如下形式: void print (Co
25、llection c) /Collection(發(fā)音為:collection of unknown) for (Object e : c) System.out.println(e);l此種形式下需要注意的是:由于print方法c參數(shù)的類(lèi)型為Collection,即表示一種不確定的類(lèi)型,因此在方法體內(nèi)不能調(diào)用與類(lèi)型相關(guān)的方法,例如add()方法。l總結(jié):使用?通配符主要用于引用對(duì)象,使用了?通配符,就只能調(diào)對(duì)象與類(lèi)型無(wú)關(guān)的方法,不能調(diào)用對(duì)象與類(lèi)型有關(guān)的方法。高級(jí)軟件人才實(shí)作培訓(xùn)專(zhuān)家高級(jí)軟件人才實(shí)作培訓(xùn)專(zhuān)家! !泛型的高級(jí)應(yīng)用有限制的通配符l限定通配符的上邊界:正確:Vector x = new
26、 Vector();錯(cuò)誤:Vector x = new Vector();l限定通配符的下邊界:正確:Vector x = new Vector();錯(cuò)誤:Vector x = new Vector();public void add(List list)list.add(abc);l問(wèn)題:以下代碼行不行?高級(jí)軟件人才實(shí)作培訓(xùn)專(zhuān)家高級(jí)軟件人才實(shí)作培訓(xùn)專(zhuān)家! !Annotation(注解) 概述l從 JDK 5.0 開(kāi)始, Java 增加了對(duì)元數(shù)據(jù)(MetaData) 的支持, 也就是 Annotation(注解)。l什么是Annotation,以及注解的作用?三個(gè)基本的 Annotation:
27、Override: 限定重寫(xiě)父類(lèi)方法, 該注解只能用于方法Deprecated: 用于表示某個(gè)程序元素(類(lèi), 方法等)已過(guò)時(shí)SuppressWarnings: 抑制編譯器警告. lAnnotation 其實(shí)就是代碼里的特殊標(biāo)記, 它用于替代配置文件,也就是說(shuō),傳統(tǒng)方式通過(guò)配置文件告訴類(lèi)如何運(yùn)行,有了注解技術(shù)后,開(kāi)發(fā)人員可以通過(guò)注解告訴類(lèi)如何運(yùn)行。在Java技術(shù)里注解的典型應(yīng)用是:可以通過(guò)反射技術(shù)去得到類(lèi)里面的注解,以決定怎么去運(yùn)行類(lèi)。l掌握注解技術(shù)的要點(diǎn):如何定義注解如何反射注解,并根據(jù)反射的注解信息,決定如何去運(yùn)行類(lèi)高級(jí)軟件人才實(shí)作培訓(xùn)專(zhuān)家高級(jí)軟件人才實(shí)作培訓(xùn)專(zhuān)家! !自定義 Annotat
28、ionl定義新的 Annotation 類(lèi)型使用 interface 關(guān)鍵字l聲明注解的屬性注解屬性的作用:原來(lái)寫(xiě)在配置文件中的信息,可以通過(guò)注解的屬性進(jìn)行描述。Annotation 的屬性聲明方式:String name();屬性默認(rèn)值聲明方式:String name() default “xxx”;特殊屬性value:如果注解中有一個(gè)名稱(chēng)value的屬性,那么使用注解時(shí)可以省略value=部分,如MyAnnotation(“xxx)特殊屬性value;高級(jí)軟件人才實(shí)作培訓(xùn)專(zhuān)家高級(jí)軟件人才實(shí)作培訓(xùn)專(zhuān)家! !JDK 的元 Annotationl元 Annotation指修飾Annotation
29、的Annotation。JDK中定義了如下元Annotation:lRetention: 只能用于修飾一個(gè) Annotation 定義, 用于指定該 Annotation 可以保留的域, Rentention 包含一個(gè) RetentionPolicy 類(lèi)型的成員變量, 通過(guò)這個(gè)變量指定域。RetentionPolicy.CLASS: 編譯器將把注解記錄在 class 文件中. 當(dāng)運(yùn)行 Java 程序時(shí), JVM 不會(huì)保留注解. 這是默認(rèn)值RetentionPolicy.RUNTIME:編譯器將把注釋記錄在 class 文件中. 當(dāng)運(yùn)行 Java 程序時(shí), JVM 會(huì)保留注解. 程序可以通過(guò)反射
30、獲取該注釋RetentionPolicy.SOURCE: 編譯器直接丟棄這種策略的注釋高級(jí)軟件人才實(shí)作培訓(xùn)專(zhuān)家高級(jí)軟件人才實(shí)作培訓(xùn)專(zhuān)家! !JDK 的元 Annotation 2lTarget:指定注解用于修飾類(lèi)的哪個(gè)成員. Target 包含了一個(gè)名為 value,類(lèi)型為ElementType的成員變量。lDocumented: 用于指定被該元 Annotation 修飾的 Annotation 類(lèi)將被 javadoc 工具提取成文檔.lInherited: 被它修飾的 Annotation 將具有繼承性.如果某個(gè)類(lèi)使用了被 Inherited 修飾的 Annotation, 則其子類(lèi)將自動(dòng)
31、具有該注解高級(jí)軟件人才實(shí)作培訓(xùn)專(zhuān)家高級(jí)軟件人才實(shí)作培訓(xùn)專(zhuān)家! !提取 Annotation 信息lJDK 5.0 在 java.lang.reflect 包下新增了 AnnotationElement 接口, 該接口代表程序中可以接受注釋的程序元素l當(dāng)一個(gè) Annotation 類(lèi)型被定義為運(yùn)行時(shí) Annotation 后, 該注釋才是運(yùn)行時(shí)可見(jiàn), 當(dāng) class 文件被載入時(shí)保存在 class 文件中的 Annotation 才會(huì)被虛擬機(jī)讀取l程序可以調(diào)用 AnnotationElement 對(duì)象的如下方法來(lái)訪問(wèn) Annotation 信息高級(jí)軟件人才實(shí)作培訓(xùn)專(zhuān)家高級(jí)軟件人才實(shí)作培訓(xùn)專(zhuān)家!
32、!北京傳智播客教育 TipTip:動(dòng)態(tài)代理:動(dòng)態(tài)代理l明確兩個(gè)概念:代理對(duì)象存在的價(jià)值:主要用于攔截對(duì)真實(shí)業(yè)務(wù)對(duì)象的訪問(wèn)。代理對(duì)象有什么方法?l現(xiàn)在要生成某一個(gè)對(duì)象的代理對(duì)象,這個(gè)代理對(duì)象通常也要編寫(xiě)一個(gè)類(lèi)來(lái)生成,所以首先要編寫(xiě)用于生成代理對(duì)象的類(lèi)。l如何編寫(xiě)生成代理對(duì)象的類(lèi),兩個(gè)要素:代理誰(shuí)如何生成代理對(duì)象l代理誰(shuí)?設(shè)計(jì)一個(gè)類(lèi)變量,以及一個(gè)構(gòu)造函數(shù),記住代理類(lèi) 代理哪個(gè)對(duì)象。l如何生成代理對(duì)象?設(shè)計(jì)一個(gè)方法生成代理對(duì)象(在方法內(nèi)編寫(xiě)代碼生成代理對(duì)象是此處編程的難點(diǎn))高級(jí)軟件人才實(shí)作培訓(xùn)專(zhuān)家高級(jí)軟件人才實(shí)作培訓(xùn)專(zhuān)家! !北京傳智播客教育 TipTip:動(dòng)態(tài)代理:動(dòng)態(tài)代理 lJava提供了一個(gè)P
33、roxy類(lèi),調(diào)用它的newInstance方法可以生成某個(gè)對(duì)象的代理對(duì)象,使用該方法生成代理對(duì)象時(shí),需要三個(gè)參數(shù):1.生成代理對(duì)象使用哪個(gè)類(lèi)裝載器2.生成哪個(gè)對(duì)象的代理對(duì)象,通過(guò)接口指定3.生成的代理對(duì)象的方法里干什么事,由開(kāi)發(fā)人員編寫(xiě)handler接口的實(shí)現(xiàn)來(lái)指定。l初學(xué)者必須理解,或不理解必須記住的2件事情:Proxy類(lèi)負(fù)責(zé)創(chuàng)建代理對(duì)象時(shí),如果指定了handler(處理器),那么不管用戶調(diào)用代理對(duì)象的什么方法,該方法都是調(diào)用處理器的invoke方法。由于invoke方法被調(diào)用需要三個(gè)參數(shù):代理對(duì)象、方法、方法的參數(shù),因此不管代理對(duì)象哪個(gè)方法調(diào)用處理器的invoke方法,都必須把自己所在的對(duì)
34、象、自己(調(diào)用invoke方法的方法)、方法的參數(shù)傳遞進(jìn)來(lái)。高級(jí)軟件人才實(shí)作培訓(xùn)專(zhuān)家高級(jí)軟件人才實(shí)作培訓(xùn)專(zhuān)家! !北京傳智播客教育 TipTip:動(dòng)態(tài)代理:動(dòng)態(tài)代理代理類(lèi)public Object invoke(Object proxy, Method method,Object args)doSomething.void run(“aaa”)void eat(“bbb”)invoke(this,run,”aaa”)invoke(this,eat,”bbb”)處理器代理對(duì)象void run(“aaa”)void eat(“bbb”)被代理對(duì)象高級(jí)軟件人才實(shí)作培訓(xùn)專(zhuān)家高級(jí)軟件人才實(shí)作培訓(xùn)專(zhuān)家!
35、!北京傳智播客教育 TipTip:動(dòng)態(tài)代理應(yīng)用:動(dòng)態(tài)代理應(yīng)用l在動(dòng)態(tài)代理技術(shù)里,由于不管用戶調(diào)用代理對(duì)象的什么方法,都是調(diào)用開(kāi)發(fā)人員編寫(xiě)的處理器的invoke方法(這相當(dāng)于invoke方法攔截到了代理對(duì)象的方法調(diào)用)。l并且,開(kāi)發(fā)人員通過(guò)invoke方法的參數(shù),還可以在攔截的同時(shí),知道用戶調(diào)用的是什么方法,因此利用這兩個(gè)特性,就可以實(shí)現(xiàn)一些特殊需求,例如:攔截用戶的訪問(wèn)請(qǐng)求,以檢查用戶是否有訪問(wèn)權(quán)限、動(dòng)態(tài)為某個(gè)對(duì)象添加額外的功能。高級(jí)軟件人才實(shí)作培訓(xùn)專(zhuān)家高級(jí)軟件人才實(shí)作培訓(xùn)專(zhuān)家! !類(lèi)加載器l類(lèi)加載器負(fù)責(zé)將 .class 文件(可能在磁盤(pán)上, 也可能在網(wǎng)絡(luò)上) 加載到內(nèi)存中, 并為之生成對(duì)應(yīng)的
36、 java.lang.Class 對(duì)象l當(dāng) JVM 啟動(dòng)時(shí),會(huì)形成由三個(gè)類(lèi)加載器組成的初始類(lèi)加載器層次結(jié)構(gòu): 高級(jí)軟件人才實(shí)作培訓(xùn)專(zhuān)家高級(jí)軟件人才實(shí)作培訓(xùn)專(zhuān)家! !類(lèi)加載器之間的父子關(guān)系和管轄范圍圖BootStrapExtClassLoaderAppClassLoaderItcastClassLoaderMyClassLoaderSystemclassLoaderJRE/lib/rt.jarJRE/lib/ext/*.jarCLASSPATH指定的所有jar或目錄傳智播客指定的特殊目錄高級(jí)軟件人才實(shí)作培訓(xùn)專(zhuān)家高級(jí)軟件人才實(shí)作培訓(xùn)專(zhuān)家! !bootstrap classloaderlbootstrap classloader:引導(dǎo)(也稱(chēng)為原始)類(lèi)加載引導(dǎo)(也稱(chēng)為原始)類(lèi)加載器器,它負(fù)責(zé)加載它負(fù)責(zé)加載Java的核心類(lèi)的核心類(lèi)。這個(gè)加載器的是非常特殊的,它實(shí)際上不是 java.lang.ClassLoader的子類(lèi),而是由JVM自身實(shí)現(xiàn)的??梢酝ㄟ^(guò)執(zhí)行以下代碼來(lái)獲得boots
溫馨提示
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 專(zhuān)項(xiàng)11 古詩(shī)文閱讀(試卷版)
- 人教版《美術(shù)》二年級(jí)上冊(cè)第8課《對(duì)印的圖形》教案
- 應(yīng)急聯(lián)動(dòng)指揮中心設(shè)計(jì)方案
- 管理會(huì)計(jì)試卷及答案 共2套
- 5.2 生活中的透鏡 說(shuō)課稿2025年初中人教版物理八年級(jí)上冊(cè)
- 暑期敬老院社會(huì)實(shí)踐報(bào)告
- 雙十一文胸店活動(dòng)策劃
- 二零二五年度北京市旅店智能化客房租賃合同
- 人力資源居間合同
- 2025年度北京市健康產(chǎn)業(yè)員工勞動(dòng)合同參考
- 小學(xué)三年級(jí)下冊(cè)數(shù)學(xué)全單元測(cè)試題加答案
- 資料分析(歷年國(guó)考真題)
- 畢業(yè)設(shè)計(jì)(論文)-幼苗移栽機(jī)結(jié)構(gòu)設(shè)計(jì)
- MOOC 食品標(biāo)準(zhǔn)與法規(guī)-西北農(nóng)林科技大學(xué) 中國(guó)大學(xué)慕課答案
- 交通調(diào)查設(shè)計(jì)方案
- 模板工程風(fēng)險(xiǎn)辨識(shí)及防范措施
- 《紅樓夢(mèng)第五回》課件2
- 2024年中國(guó)移動(dòng)校園招聘高頻考題難、易錯(cuò)點(diǎn)模擬試題(共500題)附帶答案詳解
- 1.5彈性碰撞和非彈性碰撞課件-高二上學(xué)期物理人教版選擇性
- EPC項(xiàng)目投標(biāo)人承包人工程經(jīng)濟(jì)的合理性分析、評(píng)價(jià)
- 羔羊胃提取物維B12膠囊治療慢性萎縮性胃炎伴腸化的臨床療效觀察
評(píng)論
0/150
提交評(píng)論