![給的java就業(yè)day03-基礎加強_第1頁](http://file4.renrendoc.com/view/ae7a7dc32732f42690cf1b0ba61bcf56/ae7a7dc32732f42690cf1b0ba61bcf561.gif)
![給的java就業(yè)day03-基礎加強_第2頁](http://file4.renrendoc.com/view/ae7a7dc32732f42690cf1b0ba61bcf56/ae7a7dc32732f42690cf1b0ba61bcf562.gif)
![給的java就業(yè)day03-基礎加強_第3頁](http://file4.renrendoc.com/view/ae7a7dc32732f42690cf1b0ba61bcf56/ae7a7dc32732f42690cf1b0ba61bcf563.gif)
![給的java就業(yè)day03-基礎加強_第4頁](http://file4.renrendoc.com/view/ae7a7dc32732f42690cf1b0ba61bcf56/ae7a7dc32732f42690cf1b0ba61bcf564.gif)
![給的java就業(yè)day03-基礎加強_第5頁](http://file4.renrendoc.com/view/ae7a7dc32732f42690cf1b0ba61bcf56/ae7a7dc32732f42690cf1b0ba61bcf565.gif)
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
Java基礎加強王昭珽JDK5.0新特性JDK5中新增了很多新的java特性,利用這些新語法可以幫助開發(fā)人員編寫出更加高效、清晰,安全的代碼。靜態(tài)導入自動裝箱/拆箱增強for循環(huán)可變參數(shù)枚舉反射注解泛型靜態(tài)導入JDK1.5增加的靜態(tài)導入語法用于導入類的某個靜態(tài)屬性或方法。使用靜態(tài)導入可以簡化程序?qū)︻愳o態(tài)屬性和方法的調(diào)用。它完全是為了便利而增加的新特性語法:Importstatic
包名.類名.靜態(tài)屬性|靜態(tài)方法|*例如:importstaticjava.lang.System.out//靜態(tài)導入類成員importstaticjava.lang.Math.*//使用通配符靜態(tài)導入—小細節(jié)importstaticjava.util.Arrays.sort;importstaticjava.util.Collections.sort;這是允許的,運行時會根據(jù)參數(shù)來自動找到對應的方法。注:如果導入的兩個靜態(tài)方法的參數(shù)也是一樣的話,由于不能確定是哪個方法,所有使用時需要小心自動裝箱/拆箱Java中的基本類型不是對象,因此包裝類用來當做對象版本的基本類型。當你要在兩者之間來來回回轉(zhuǎn)換時,事情就變得很討厭了。如下所示:春天來了,Tiger中提供了兩個新的功能----裝箱和拆箱,來自動執(zhí)行這些轉(zhuǎn)換。自動裝箱/拆箱自動裝箱:指開發(fā)人員可以把一個基本數(shù)據(jù)類型直接賦值給對應的包裝類。Autoboxing自動拆箱:指開發(fā)人員可以把一個包裝類對象直接賦給對應的基本數(shù)據(jù)類型。Autounboxing典型應用:
自動裝箱/拆箱思考:Integeri=null;intj=i;語法有無錯誤,能否運行?自動裝箱/拆箱—細節(jié)1Java的規(guī)范指出:特定的基本類型一定得被box成相同的包裝類型。這些對象會被高速緩存以重復使用,并且會被當做一般對象使用。這些特殊的值是boolean值的true和false、所有的byte值、介于-128至127的short與int值,以及介于\u0000與\u007F之間的任何一個char。自動裝箱/拆箱—細節(jié)2在一般的情況下,Java借由使用方法的名稱來調(diào)用method。在方法有重載的情況下,需要檢查方法的參數(shù)來決定調(diào)用哪個方法,如果沒有找到符合的參數(shù),會出現(xiàn)編譯錯誤。增強for循環(huán)增強for循環(huán)又稱為“foreach”或“enhancedfor”循環(huán)拋棄迭代:在JDK5以前的版本中,遍歷數(shù)組或集合中的元素,需先獲得數(shù)組的長度或集合的迭代器,比較麻煩!因此JDK5中定義了一種新的語法——增強for循環(huán),以簡化此類操作。增強for循環(huán)只能用在數(shù)組、或?qū)崿F(xiàn)Iterable接口的子類上語法格式: for(變量類型變量:需迭代的數(shù)組或集合) }示例:操作數(shù)組、List和Map(傳統(tǒng)&Foreache)增強for循環(huán)使用增強for循環(huán)的幾個注意事項(以下程序的輸出結(jié)果?)intarr[]=newint[5];for(intnum:arr){ num=1;}System.out.println(arr[0]);List<String>list=newArrayList<String>();list.add("xxx");for(Stringstr:list){ str="yyy";}System.out.println(list.get(0));可變參數(shù)思考假如你要寫幾個方法,分別用于計算2個整數(shù)之和、3個整數(shù)之和、4個整數(shù)之和………..你該怎么做?可變參數(shù)可變參數(shù)(variableargument)允許你指定可以采用多個同類型參數(shù)的方法,而不需要事先確定參數(shù)的數(shù)目??勺儏?shù)。語法:
publicvoidfoo(int…args){ }注意事項:調(diào)用可變參數(shù)的方法時,編譯器將自動創(chuàng)建一個數(shù)組保存?zhèn)鬟f給方法的可變參數(shù),因此,程序員可以在方法體中以數(shù)組的形式訪問可變參數(shù)在一個方法參數(shù)中只能使用一個省略號;且省略號必須出現(xiàn)在方法中參數(shù)列表的最后一個位置。不可變類不可變類,是指當創(chuàng)建了這個類的實例后,就不允許修改它的屬性值。在JDK的基本類庫中,所有基本類型的包裝類,如Integer和Long及String,都是不可變類。如果創(chuàng)建了他們的對象,在程序代碼中無法再改變這些對象的值,因為他們沒有提供修改屬性的方法。不可變類能是程序更加安全,不容易出錯不可變類是線程安全的,當多個線程訪問不可變類的同一個實例時,無需進行線程同步。用戶自定義不可變類1、把屬性privatefinal類型2、不對外公開修改屬性的set方法,只提供get方法3、在構(gòu)造方法中初始化所有屬性4、覆蓋Object類的equals和hashCode方法在創(chuàng)建不可變類時,假如它的屬性的類型是可變類型,在必要的情況下,必須提供保護性拷貝,否則,這個不可變類實例的屬性仍然有可能被錯誤地修改??匆韵麓a:不可變類---改進通過采用保護性拷貝,其他程序無法獲得與Schedule對象關(guān)聯(lián)的Date對象的引用如果Schedule類中被final修飾的屬性所屬的類是不可變類,就無需提供保護性拷貝,因為該屬性所引用的實例值永遠不會被改變枚舉類為什么需要枚舉?一些方法在運行時,它需要的數(shù)據(jù)不能是任意的,而必須是一定范圍內(nèi)的值,比如成績Grade只能為ABCDE。此類問題在JDK5以前采用自定義帶有枚舉功能的類解決,Java5以后可以直接使用枚舉予以解決。JDK5新增的enum關(guān)鍵字用于定義一個枚舉類。一個枚舉也可以有構(gòu)造函數(shù)、字段和方法示例枚舉類帶抽象方法的枚舉枚舉類枚舉類具有如下特性:枚舉類也是一種特殊形式的Java類。枚舉類中聲明的每一個枚舉值代表枚舉類的一個實例對象。與java中的普通類一樣,在聲明枚舉類時,也可以聲明屬性、方法和構(gòu)造函數(shù),但枚舉類的構(gòu)造函數(shù)必須為私有的(這點不難理解)。枚舉類也可以實現(xiàn)接口、或繼承抽象類。JDK5中擴展了swith語句,它除了可以接收int,byte,char,short外,還可以接收一個枚舉類型。若枚舉類只有一個枚舉值,則可以當作單態(tài)設計模式使用。枚舉類Java中聲明的枚舉類,均是java.lang.Enum類的孩子,它繼承了Enum類的所有方法。常用方法:name()ordinal()valueof(Stringname)此方法雖然在JDK文檔中查找不到values()此方法雖然在JDK文檔中查找不到,但每個枚舉類都具有該方法,它遍歷枚舉類的所有枚舉值非常方便。練習:請編寫一個關(guān)于星期幾的枚舉WeekDay,要求:枚舉值:Mon,Tue,Wed,Thu,Fri,Sat,Sun該枚舉要有一個方法,調(diào)用該方法返回中文格式的星期。創(chuàng)建對象思考如何創(chuàng)建一個對象,有幾種方式?反射什么是反射?反射就是把Java類中的各種成分映射成一個個的java對象。例如,一個類有:成員變量,方法,構(gòu)造方法,包等等信息,利用反射技術(shù)可以對一個類進行解剖,把各個組成部分映射成一個個對象。反射用在哪里?QuickStart:利用反射加載一個類并調(diào)用其中的方法Class類要利用反射,必須先得到代表字節(jié)碼的Class。Class類用于表示.class文件(字節(jié)碼)。如何得到某個class文件對應的class對象。類名.class,對象.getClass()Class.forName(“類名”)
基本類型的包裝類.TYPE總之,只要是在源程序中出現(xiàn)的類型,都有各自的Class實例對象,例如,int,void…解剖類Class對象提供了如下常用方法:publicConstructorgetConstructor(Class<?>…parameterTypes)publicMethodgetMethod(Stringname,Class<?>…parameterTypes)publicFieldgetField(Stringname)publicpublicConstructorgetDeclaredConstructor(Class<?>…parameterTypes)publicMethodgetDeclaredMethod(Stringname,Class<?>…parameterTypes)publicFieldgetDeclaredField(Stringname)這些方法分別用于從類中解剖出構(gòu)造函數(shù)、方法和成員變量(屬性)。解剖出的成員分別使用Constructor、Method、Field對象表示。思考:假設你是一個框架的設計者,解剖出這些成員后干什么?利用Constructor創(chuàng)建對象Constructor類提供了如下方法,用于創(chuàng)建類的對象:publicObjectnewInstance(Object…initargs)initargs用于指定構(gòu)造函數(shù)接收的參數(shù)練習:反射類無參、有參、私有的構(gòu)造函數(shù),創(chuàng)建類的對象Class類的newInstance()方法也可創(chuàng)建類的實例,其內(nèi)部工作原理是先得無參的構(gòu)造方法,再用構(gòu)造方法創(chuàng)建實例對象。Stringobj=(String)Class.forName("java.lang.String").newInstance();利用Method調(diào)用方法Method提供了如下方法,用于執(zhí)行它所代表的方法publicObjectinvoke(Objectobj,Object…args)練習:使用Method分別執(zhí)行無參、有參、多參(帶數(shù)組和基本數(shù)據(jù)類型)、靜態(tài)、私有的方法反射main方法jdk1.4和jdk1.5的invoke方法的區(qū)別1.5:publicObjectinvoke(Objectobj,Object…args)1.4:publicObjectinvoke(Objectobj,Object[]args)反射main方法問題:啟動Java程序的main方法的參數(shù)是一個字符串數(shù)組,即publicstaticvoidmain(String[]args),通過反射方式來調(diào)用這個main方法時,如何為invoke方法傳遞參數(shù)呢?按jdk1.5的語法,整個數(shù)組是一個參數(shù),而按jdk1.4的語法,數(shù)組中的每個元素對應一個參數(shù),當把一個字符串數(shù)組作為參數(shù)傳遞給invoke方法時,javac會到底按照哪種語法進行處理呢?jdk1.5肯定要兼容jdk1.4的語法,會按jdk1.4的語法進行處理,即把數(shù)組打散成為若干個單獨的參數(shù)。所以,在給main方法傳遞參數(shù)時,不能使用代碼mainMethod.invoke(null,newString[]{“xxx”}),javac只把它當作jdk1.4的語法進行理解,而不把它當作jdk1.5的語法解釋,因此會出現(xiàn)參數(shù)類型不對的問題。解決辦法:mainMethod.invoke(null,newObject[]{newString[]{"xxx"}});mainMethod.invoke(null,(Object)newString[]{"xxx"});,編譯器會作特殊處理,編譯時不把參數(shù)當作數(shù)組看待,也就不會數(shù)組打散成若干個參數(shù)了Field類Field類代表某個類中的一個成員變量練習:私有變量、靜態(tài)變量、公共變量實例編寫一個基于xml的配置文件<?xmlversion="1.0"encoding="UTF-8"?><beans><beanid="demo"class="cn.itcast.Student"method="sleep"/></beans>利用反射手法動態(tài)加載類并執(zhí)行方法內(nèi)省(Introspector)—JavaBean為什么要學內(nèi)???開發(fā)框架時,經(jīng)常需要使用java對象的屬性來封裝程序的數(shù)據(jù),每次都使用反射技術(shù)完成此類操作過于麻煩,所以SUN公司開發(fā)了一套API,專門用于操作java對象的屬性。什么是JavaBean和屬性的讀寫方法?通過內(nèi)省技術(shù)訪問(java.beans包提供了內(nèi)省的API)JavaBean的兩種方式。通過PropertyDescriptor類操作Bean的屬性通過Introspector類獲得Bean對象的BeanInfo,然后通過BeanInfo來獲取屬性的描述器(PropertyDescriptor),通過這個屬性描述器就可以獲取某個屬性對應的getter/setter方法,然后通過反射機制來調(diào)用這些方法。北京傳智播客教育PropertyDescriptor來操作屬性:PropertyDescriptor顧名思義,就是屬性描述之意。它通過反射快速操作JavaBean的getter/setter方法。重要方法:getWriteMethod()–獲取setter方法,返回Method對像
getReadMethod()–獲取getter方法,返回Method對像內(nèi)省(Introspector)--練習北京傳智播客教育內(nèi)省—beanutils工具包:Beanutils是Apache開發(fā)的一套快速操作JavaBeangetter/setter方法的API,目前比較流行。準備包:mons-logging.jar語法:設置:BeanUtils.setProperty(Objectbean,StringpropertyName,StringpropertyValue);獲取:BeanUtils.getProperty(Objectbean,StringPropetyName);BeanUtils示例設置屬性值類型的自動轉(zhuǎn)換類型轉(zhuǎn)換器北京傳智播客教育BeanUtils將Map屬性自動放到Bean中可以操作成功的原則-Map的key必須要與Bean的屬性一致。Mapm=newHashMap();m.put("name","roseJack");Personperson=newPerson();BeanUtils.populate(person,m);System.err.println(person);北京傳智播客教育使用BeanUtils實現(xiàn)級聯(lián)操作:泛型(Generic)—泛形的作用JDK5以前,對象保存到集合中就會失去其特性,取出時通常要程序員手工進行類型的強制轉(zhuǎn)換,這樣不可避免就會引發(fā)程序的一些安全性問題。例如:ArrayListlist=newArrayList();list.add("abc");Integernum=(Integer)list.get(0);//運行時會出錯,但編碼時發(fā)現(xiàn)不了list.add(newRandom());list.add(newArrayList());for(inti=0;i<list.size();i++){ (?)list.get(i);//此處取出來的對象應轉(zhuǎn)換成什么類型}泛型(Generic)—泛形的作用JDK5中的泛形允許程序員在編寫集合代碼時,就限制集合的處理類型,從而把原來程序運行時可能發(fā)生問題,轉(zhuǎn)變?yōu)榫幾g時的問題,以此提高程序的可讀性和穩(wěn)定性(尤其在大型程序中更為突出)。注意:泛型是提供給javac編譯器使用的,它用于限定集合的輸入類型,讓編譯器在源代碼級別上,即擋住向集合中插入非法數(shù)據(jù)。但編譯器編譯完帶有泛形的java程序后,生成的class文件中將不再帶有泛型信息,以此使程序運行效率不受到影響,這個過程稱之為“擦除”。泛形的基本術(shù)語,以ArrayList<E>為例:<>念著typeofArrayList<E>中的E稱為類型參數(shù)變量ArrayList<Integer>中的Integer稱為實際類型參數(shù)整個稱為ArrayList<E>泛型類型整個ArrayList<Integer>稱為參數(shù)化的類型ParameterizedType泛型典型應用使用迭代器迭代泛形集合中的元素。使用增強for循環(huán)迭代泛形集合中的元素。存取HashMap中的元素。使用泛形時的幾個常見問題:使用泛形時,泛形類型須為引用類型,不能是基本數(shù)據(jù)類型ArrayList<String>list=newArrayList<Object>();ArrayList<Object>list=newArrayList<String>();ArrayList<String>list=newArrayList();ArrayListlist=newArrayList<String>();自定義泛形——泛型方法Java程序中的普通方法、構(gòu)造方法和靜態(tài)方法中都可以使用泛型。方法使用泛形前,必須對泛形進行聲明,語法:<T>,T可以是任意字母,但通常必須要大寫。<T>通常需放在方法的返回值聲明之前。例如:
publicstatic<T>voiddoxx(Tt);練習:編寫一個泛形方法,實現(xiàn)數(shù)組元素的交換。編寫一個泛形方法,接收一個任意數(shù)組,并顛倒數(shù)組中的所有元素。注意:只有引用類型才能作為泛型方法的實際參數(shù)。北京傳智播客教育在類上面定義的范型:public
classA<T>{ publicTgetT(Class<T>cls)throwsException{ Tt=cls.newInstance(); returnt; }}類上面定義的泛型不適用與靜態(tài)方法自定義泛形——泛型類和反射泛形如果一個類多處都要用到同一個泛型,這時可以把泛形定義在類上(即類級別的泛型),語法格式如下:
publicclassGenericDao<T>{ privateTfield1; publicvoidsave(Tobj){} publicTgetId(intid){} }注意,靜態(tài)方法不能使用類定義的泛形,而應單獨定義泛形。泛形的典型應用:BaseDao和反射泛型泛型的高級應用——通配符定義一個方法,接收一個集合,并打印出集合中的所有元素,如下所示:
voidprint(Collection<String>c){
for(Stringe:c){
System.out.println(e);
}}
問題:該方法只能打印保存了Object對象的集合,不能打印其它集合。通配符用于解決此類問題,方法的定義可改寫為如下形式:voidprint(Collection<?>c){
//Collection<?>(發(fā)音為:"collectionofunknown")
for(Objecte:c){ System.out.println(e);}}此種形式下需要注意的是:由于print方法c參數(shù)的類型為Collection<?>,即表示一種不確定的類型,因此在方法體內(nèi)不能調(diào)用與類型相關(guān)的方法,例如add()方法??偨Y(jié):使用?通配符主要用于引用對象,使用了?通配符,就只能調(diào)對象與類型無關(guān)的方法,不能調(diào)用對象與類型有關(guān)的方法。泛型的高級應用——有限制的通配符限定通配符的上邊界:正確:Vector<?extendsNumber>x=newVector<Integer>();錯誤:Vector<?extendsNumber>x=newVector<String>();限定通配符的下邊界:正確:Vector<?superInteger>x=newVector<Number>();錯誤:Vector<?superInteger>x=newVector<Byte>();publicvoidadd(List<?extendsString>list){ list.add("abc");}問題:以下代碼行不行?Annotation(注解)概述注解起到標識做用。比如Junit的@Test注解。Junit會在運行時檢查方法上是否存在此注解,如果存在,就通過反射來運行你的方法從JDK5.0開始,Java增加了對元數(shù)據(jù)(MetaData)的支持,也就是Annotation(注解)。三個基本的Annotation:@Override:限定重寫父類方法,該注解只能用于方法@Deprecated:用于表示某個程序元素(類,方法等)已過時@SuppressWarnings:抑制編譯器警告.Annotation其實就是代碼里的特殊標記,它用于替代配置文件,也就是說,傳統(tǒng)方式通過配置文件告訴類如何運行,有了注解技術(shù)后,開發(fā)人員可以通過注解告訴類如何運行。在Java技術(shù)里注解的典型應用是:可以通過反射技術(shù)去得到類里面的注解,以決定怎么去運行類。掌握注解技術(shù)的要點:如何定義注解如何反射注解,并根據(jù)反射的注解信息,決定如何去運行類自定義Annotation定義新的Annotation類型使用@interface關(guān)鍵字聲明注解的屬性注解屬性的作用:原來寫在配置文件中的信息,可以通過注解的屬性進行描述。Annotation的屬性聲明方式:Stringname();屬性類型:基本類型、String、Class、枚舉、注解及以上類型的一維數(shù)組類型屬性默認值聲明方式:Stringname()default“xxx”;特殊屬性value:如果注解中有一個名稱value的屬性,那么使用注解時可以省略value=部分,如@MyAnnotation(“xxx")特殊屬性value[];JDK的元Annotation元Annotation指修飾Annotation的Annotation。JDK中定義了如下元Annotation:@Retention:只能用于修飾一個Annotation定義,用于指定該Annotation可以保留的域,@Rentention包含一個RetentionPolicy類型的成員變量,通過這個變量指定域。RetentionPolicy.CLASS:編譯器將把注解記錄在class文件中.當運行Java程序時,JVM不會保留注解.這是默認值RetentionPolicy.RUNTIME:編譯器將把注釋記錄在class文件中.當運行Java程序時,JVM會保留注解.程序可以通過反射獲取該注釋RetentionPolicy.SOURCE:編譯器直接丟棄這種策略的注釋JDK的元Annotation2@Target:指定注解用于修飾類的哪個成員.@Target包含了一個名為value,類型為ElementType的成員變量。小練習:將數(shù)據(jù)庫的配置采用注解實現(xiàn)JDK的元Annotation2@Documented:用于指定被該元Annotation修飾的Annotation類將被javadoc工具提取成文檔.@Inherited:被它修飾的Annotation將具有繼承性.如果某個類使用了被@Inherited修飾的Annotation,則其子類將自動具有該注解提取Annotation信息JDK5.0在java.lang.reflect包下新增了AnnotationElement接口,該接口代表程序中可以接受注釋的程序元素當一個Annotation類型被定義為運行時Annotation后,該注釋才是運行時可見,當class文件被載入時保存在class文件中的Annotation才會被虛擬機讀取程序可以調(diào)用AnnotationElement對象的如下方法來訪問Annotation信息代理的概念和作用生活中的代理武漢人從武漢的代理商手中買聯(lián)想電腦和直接跑到北京來聯(lián)想總部買電腦,你覺得最終的主體業(yè)務目標有什么區(qū)別?基本上一樣吧,都解決了核心問題,但是,一點區(qū)別都沒有嗎?從代理商那里買真得一點好處都沒有嗎?程序中的代理要為已存在的多個具有相同接口的目標類的各個方法增加一些系統(tǒng)功能,例如,異常處理、日志、計算方法的運行時間、事物管理等等,你準備如何做?編寫一個與目標類具有相同接口的代理類,代理類的每個方法調(diào)用目標類的相同方法,并在調(diào)用方法時加上系統(tǒng)功能的代碼。如果采用工廠模式和配置文件的方式進行管理,則不需要修改客戶端程序,在配置文件中配置使用目標類還是代理類,這樣以后很容易切換,譬如,想要日志功能時就配置代理類,否則配置目標類,這樣,增加系統(tǒng)功能很容易,以后運行一段時間后,又想去掉系統(tǒng)功能也很容易。代理架構(gòu)圖
Client客戶端調(diào)用程序接口doSomethin()Target目標類Proxy代理類doSomething(){//業(yè)務代碼}doSomething(){//前置系統(tǒng)代碼目標對象.doSomething()//后置系統(tǒng)代碼}AOP系統(tǒng)中存在交叉業(yè)務,一個交叉業(yè)務就是要切入到系統(tǒng)中的一個面。使用代理技術(shù)正好可以解決這種問題,代理是實現(xiàn)AOP功能的核心和關(guān)鍵技術(shù)動態(tài)代理技術(shù)要為系統(tǒng)中的各種接口的類增加代理功能,那將需要太多的代理類,全部采用靜態(tài)代理方式,將是一件非常麻煩的事情!JVM可以在運行期間動態(tài)生成類的字節(jié)碼,這種動態(tài)生成的類往往被用作代理類,即動態(tài)代理類。JVM生成的動態(tài)類必須實現(xiàn)一個或多個接口,所以,JVM生成的動態(tài)類只能用作具有相同接口的目標類的代理。CGLIB庫可以動態(tài)生成一個類的子類,一個類的子類也可以用作該類的代理,所以,如果要為一個沒有實現(xiàn)接口的類生成動態(tài)代理類,那么可以使用CGLIB庫。代理類的哥哥方法中通常除了要調(diào)用目標的相應方法和對外返回目標返回的結(jié)果外,還可以在代理方法中的如下四個位置加上系統(tǒng)功能代碼:1、調(diào)用目標方法之前2、調(diào)用目標方法之后3、調(diào)用目標方法前后4、在處理目標方法異常的catch塊中分析JVM動態(tài)生成的類創(chuàng)建實現(xiàn)了Collection接口的動態(tài)類和查看其名稱,分析Proxy.getProxyClass方法的各個參數(shù)編碼列出動態(tài)類中的所有構(gòu)造方法和參數(shù)簽名編碼列出動態(tài)類中的所有方法和參數(shù)簽名創(chuàng)建動態(tài)類的實例對象用反射獲得構(gòu)造方法編寫一個最簡單的InvocationHandler類調(diào)用構(gòu)造方法創(chuàng)建動態(tài)類的實例對象,并將編寫的InvocationHandler類的實例對象傳進去打印創(chuàng)建的對象和調(diào)用對象的沒有返回值的方法和getClass方法,演示調(diào)用其他沒有返回值的方法報告了異常。將創(chuàng)建動態(tài)類的實例對象的代理改成匿名內(nèi)部類的形式編寫。總結(jié)思考:讓JVM創(chuàng)建動態(tài)類,需要給它提供哪些信息?Proxy.newProxyInstance()一步到位創(chuàng)建代理對象的實例北京傳智播客教育Tip:動態(tài)代理明確兩個概念:代理對象存在的價值:主要用于攔截對真實業(yè)務對象的訪問。代理對象有什么方法?現(xiàn)在要生成某一個對象的代理對象,這個代理對象通常也要編寫一個類來生成,所以首先要編寫用于生成代理對象的類。如何編寫生成代理對象的類,兩個要素:代理誰如何生成代理對象代理誰?設計一個類變量,以及一個構(gòu)造函數(shù),記住代理類代理哪個對象。如何生成代理對象?設計一個方法生成代理對象(在方法內(nèi)編寫代碼生成代理對象是此處編程的難點)北京傳智播客教育Tip:動態(tài)代理Java提供了一個Proxy類,調(diào)用它的newInstance方法可以生成某個對象的代理對象,使用該方法生成代理對象時,需要三個參數(shù):1.生成代理對象使用哪個類裝載器2.生成哪個對象的代理對象,通過接口指定3.生成的代理對象的方法里干什么事,由開發(fā)人員編寫handler接口的實現(xiàn)來指定。初學者必須理解,或不理解必須記住的2件事情:Proxy類負責創(chuàng)建代理對象時,如果指定了handler(處理器),那么不管用戶調(diào)用代理對象的什么方法,該方法都是調(diào)用處理器的invoke方法。由于invoke方法被調(diào)用需要三個參數(shù):代理對象、方法、方法的參數(shù),因此不管代理對象哪個方法調(diào)用處理器的invoke方法,都必須把自己所在的對象、自己(調(diào)用invoke方法的方法)、方法的參數(shù)傳遞進來。北京傳智播客教育Tip:動態(tài)代理代理類publicObjectinvoke(Objectproxy,Methodmethod,Object[]args){ doSomething…….}voidrun(“aaa”){
}voideat(“bbb”){}invoke(this,run,”aaa”)invoke(this,eat,”bbb”)處理器代理對象voidrun(“aaa”)voideat(“bbb”)被代理對象北京傳智播客教育Tip:動態(tài)代理應用在動態(tài)代理技術(shù)里,由于不管用戶調(diào)用代理對象的什么方法,都是調(diào)用開發(fā)人員編寫的處理器的invoke方法(這相當于invoke方法攔截到了代理對象的方法調(diào)用)。并且,開發(fā)人員通過invoke方法的參數(shù),還可以在攔截的同時,知道用戶調(diào)用的是什么方法,因此利用這兩個特性,就可以實現(xiàn)一些特殊需求,例如:攔截用戶的訪問請求,以檢查用戶是否有訪問權(quán)限、動態(tài)為某個對象添加額外的功能。類加載器類加載器負責將.class文件(可能在磁盤上,也
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年度建筑工程施工合同合同風險預警與防范措施協(xié)議
- 2025年中國兩性霉素B行業(yè)市場全景監(jiān)測及投資策略研究報告
- 個人購買門臉房合同范本
- 上海bim合同范本
- 農(nóng)場自建旅館合同范本
- 代理退稅合同范本
- 2025年度高新技術(shù)產(chǎn)業(yè)公司總經(jīng)理專項聘用合同
- 養(yǎng)殖競標合同范本
- 駕校教練車承包合同范本
- 2025年陶瓷化工填料項目可行性研究報告
- QC成果地下室基礎抗浮錨桿節(jié)點處防水施工方法的創(chuàng)新
- 第一章:公共政策理論模型
- 中藥審核處方的內(nèi)容(二)
- (完整)金正昆商務禮儀答案
- RB/T 101-2013能源管理體系電子信息企業(yè)認證要求
- GB/T 10205-2009磷酸一銨、磷酸二銨
- 公司財務制度及流程
- 高支模專項施工方案(專家論證)
- 《物流與供應鏈管理-新商業(yè)、新鏈接、新物流》配套教學課件
- 物聯(lián)網(wǎng)項目實施進度計劃表
- MDD指令附錄一 基本要求檢查表2013版
評論
0/150
提交評論