已閱讀5頁,還剩42頁未讀, 繼續(xù)免費(fèi)閱讀
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
北京傳智播客教育 ,就業(yè)方向,XML,Servlet,JSP,DB,JDBC,Mail,Java,HTML,JavaScript,Struts,Spring,Hibernate,嵌入式開發(fā),手機(jī),智能終端,北京傳智播客教育 ,Java基礎(chǔ)加強(qiáng),焦寧波,Eclipse的使用,工作空間(workspace)、工程(project) 在eclipse下Java程序的編寫和運(yùn)行,及java運(yùn)行環(huán)境的配置。 快捷鍵的配置,常用快捷鍵: 內(nèi)容提示:Alt + / 快速修復(fù):Ctrl + 1 導(dǎo)包:Ctrl + shift + O 格式化代碼塊:ctrl + shift + F 刪除一行:Ctrl + D 添加注釋: Ctrl+Shift+/ Ctrl + / 除去注釋 :Ctrl+Shift+ Ctrl + / 程序的調(diào)試和運(yùn)行(寫數(shù)組反序輸出程序演示) F5(跳入) F6(跳過) F7(跳出) 案例 JUnit (Java 單元測試),JDK 5.0 新特性,JDK5中新增了很多新的java特性,利用這些新語法可以幫助開發(fā)人員編寫出更加高效、清晰,安全的代碼。 靜態(tài)導(dǎo)入 自動(dòng)裝箱/拆箱 增強(qiáng)for循環(huán) 可變參數(shù) 枚舉 反射 內(nèi)省 泛型 元數(shù)據(jù),靜態(tài)導(dǎo)入,JDK 1.5 增加的靜態(tài)導(dǎo)入語法用于導(dǎo)入類的某個(gè)靜態(tài)屬性或方法。使用靜態(tài)導(dǎo)入可以簡化程序?qū)︻愳o態(tài)屬性和方法的調(diào)用。 語法: import static 包名.類名.靜態(tài)屬性|靜態(tài)方法|* 例如: import static java.lang.System.out import static java.lang.Math.* 案例 求圓的面積、任意半徑圓的面積,自動(dòng)裝箱/拆箱,JDK5.0的語法允許開發(fā)人員把一個(gè)基本數(shù)據(jù)類型直接賦給對(duì)應(yīng)的包裝類變量, 或者賦給 Object 類型的變量,這個(gè)過程稱之為自動(dòng)裝箱。 自動(dòng)拆箱與自動(dòng)裝箱與之相反,即把包裝類對(duì)象直接賦給一個(gè)對(duì)應(yīng)的基本類型變量。 典型應(yīng)用: List list = new ArrayList(); list.add(1); int j = (Integer)list.get(0);,Wrapper Class,裝箱,拆箱,Auto,思考: String str = “itcast” ; 是否是自動(dòng)裝箱?,增強(qiáng)for循環(huán),引入增強(qiáng)for循環(huán)的原因:在JDK5以前的版本中,遍歷數(shù)組或集合中的元素,需先獲得數(shù)組的長度或集合的迭代器,比較麻煩! 因此JDK5中定義了一種新的語法增強(qiáng)for循環(huán),以簡化此類操作。增強(qiáng)for循環(huán)只能用在數(shù)組、或?qū)崿F(xiàn)Iterable接口(Set/List)的集合類上。 語法格式: for(變量類型 變量 : 需迭代的數(shù)組或集合) ,增強(qiáng)for循環(huán),使用增強(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 = new ArrayList(); list.add(“xxx“); for(String str : list) str = “yyy“; System.out.println(list.get(0);,增強(qiáng)for循環(huán)在迭代集合時(shí)必須使用范型,否則就只能采用Object接收。,可變參數(shù),測試JDK中具有可變參數(shù)的類Arrays.asList()方法。分別傳多個(gè)參、傳數(shù)組,傳數(shù)組又傳參的情況。 public static List asList(T. a) 注意:傳入基本數(shù)據(jù)類型數(shù)組的問題。 從JDK 5開始, Java 允許為方法定義長度可變的參數(shù)。語法: public void foo(int args) 注意事項(xiàng): 調(diào)用可變參數(shù)的方法時(shí), 編譯器將自動(dòng)創(chuàng)建一個(gè)數(shù)組保存?zhèn)鬟f給方法的可變參數(shù),因此,程序員可以在方法體中以數(shù)組的形式訪問可變參數(shù)。 可變參數(shù)只能處于參數(shù)列表的最后, 所以一個(gè)方法最多只能有一個(gè)長度可變的參數(shù)。,枚舉類,為什么需要枚舉? 一些方法在運(yùn)行時(shí),它需要的數(shù)據(jù)不能是任意的,而必須是一定范圍內(nèi)的值,此類問題在JDK5以前采用自定義帶有枚舉功能的類解決,Java5以后可以直接使用枚舉予以解決。 舉例 交通燈(紅、黃、綠) 性別(男、女) 星期(星期一、二、三) 分?jǐn)?shù)等級(jí)(A、B、C、D、E) JDK 5新增的 enum 關(guān)鍵字用于定義一個(gè)枚舉類。,枚舉類,枚舉的實(shí)現(xiàn) 使用enum定義枚舉類 在枚舉類中定義枚舉值(大寫) 枚舉類具有如下特性: 枚舉類也是一種特殊形式的Java類。 枚舉類中聲明的每一個(gè)枚舉值代表枚舉類的一個(gè)實(shí)例對(duì)象。 與java中的普通類一樣,在聲明枚舉類時(shí),也可以聲明屬性、方法和構(gòu)造函數(shù),但枚舉類的構(gòu)造函數(shù)必須為私有的(這點(diǎn)不難理解)。 枚舉類也可以實(shí)現(xiàn)接口(序列化)、或繼承抽象類。 JDK5中擴(kuò)展了swith語句,它除了可以接收int, byte, char, short外,還可以接收一個(gè)枚舉類型(enum)。 若枚舉類只有一個(gè)枚舉值,則可以當(dāng)作單態(tài)設(shè)計(jì)模式使用。 練習(xí):請編寫一個(gè)關(guān)于星期幾的枚舉WeekDay,要求: 枚舉值:Mon,Tue,Wed,Thu,Fri,Sat,Sun 該枚舉要有一個(gè)方法,調(diào)用該方法返回中文格式的星期。,枚舉類,Java中聲明的枚舉類,均是java.lang.Enum類的孩子,它繼承了Enum類的所有方法。常用方法: name() 返回枚舉常量的name ordinal() 返回枚舉常量的聲明索引 valueof(Class enumClass, String name)返回指定名稱的枚舉類 values() 此方法雖然在JDK文檔中查找不到,但每個(gè)枚舉類都具有該方法,它遍歷枚舉類的所有枚舉值非常方便。,注意:JDK API文檔中并不是包含了所有類、所有類的方法、字 段, 沒有被API收錄的類、方法、字段是SUN公司內(nèi)部使用的,開 發(fā)人員如果知道,也可以使用。,反射(Reflect),什么是反射? 反射就是把Java類中的各種成分映射成一個(gè)個(gè)的java對(duì)象。例如,一個(gè)類有:包、成員變量、方法、構(gòu)造方法等等信息,利用反射技術(shù)可以對(duì)一個(gè)類進(jìn)行解剖,把各個(gè)組成部分映射成與之相對(duì)應(yīng)的對(duì)象。 反射用在哪里? 框架 學(xué)習(xí)反射應(yīng)該掌握些什么? 獲取類的字節(jié)碼、構(gòu)造器、方法、字段對(duì)象的方法和使用。,Class類,Class類用于表示.class文件,畫圖演示一個(gè)對(duì)象的創(chuàng)建過程。 如何得到某個(gè)class文件對(duì)應(yīng)的class對(duì)象。 類名.class,知道類名 對(duì)象.getClass() Class.forName(“類名”) 推薦使用 數(shù)組類型的Class實(shí)例對(duì)象 Class.isArray() Class.isEnum() 總之,只要是在源程序中出現(xiàn)的類型,都有各自的Class實(shí)例對(duì)象,例如,int,void,Constructor類,Constructor類的實(shí)例對(duì)象代表類的一個(gè)構(gòu)造方法。 得到某個(gè)類所有的公共構(gòu)造方法,例: Constructor constructors= Class.forName(“java.lang.String“).getConstructors(); 得到某個(gè)類所有的構(gòu)造方法,例: Constructor constructors= Class.forName(“java.lang.String“). getDeclaredConstructors() 得到某一個(gè)構(gòu)造方法,例: Constructor constructor = Class.forName(“java.lang.String”).getConstructor(StringBuffer.class); 利用構(gòu)造方法創(chuàng)建實(shí)例對(duì)象: String str = (String)constructor.newInstance(“abc”); Class類的newInstance()方法也可創(chuàng)建類的實(shí)例,其內(nèi)部工作原理是先得無參的構(gòu)造方法,再用構(gòu)造方法創(chuàng)建實(shí)例對(duì)象。 String obj =(String)Class.forName(“java.lang.String“).newInstance();,Field類,Field類代表某個(gè)類中的一個(gè)成員變量 問題:得到的Field對(duì)象是對(duì)應(yīng)到類上面的成員變量,還是對(duì)應(yīng)到對(duì)象上的成員變量?類只有一個(gè),而該類的實(shí)例對(duì)象有多個(gè),如果是與對(duì)象關(guān)聯(lián),那關(guān)聯(lián)的是哪個(gè)對(duì)象呢?所以字段Field x 代表的是x的定義,而不是具體的x變量。(注意訪問權(quán)限的問題) 示例代碼: 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(“cn.itcast.corejava.ReflectPoint“).getDeclaredField(“x“); x.setAccessible(true); / 獲取私有屬性 暴力反射 x.setInt(new User(),345); System.out.println(x.get(point);,Method類,Method類代表某個(gè)類中的一個(gè)成員方法 得到類中的某一個(gè)方法: 例子: Method charAt = Class.forName(“java.lang.String“).getMethod(“charAt“, int.class); 調(diào)用方法: 通常方式:System.out.println(str.charAt(1); 反射方式: System.out.println(charAt.invoke(str, 1); 注意:如果傳遞給Method對(duì)象的invoke()方法的第一個(gè)參數(shù)為null,這有著什么樣的意義呢?說明該Method對(duì)象對(duì)應(yīng)的是一個(gè)靜態(tài)方法! jdk1.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的語法,需要將一個(gè)數(shù)組作為參數(shù)傳遞給invoke方法時(shí),數(shù)組中的每個(gè)元素分別對(duì)應(yīng)被調(diào)用方法中的一個(gè)參數(shù),所以,調(diào)用charAt方法的代碼也可以用Jdk1.4改寫為 charAt.invoke(“str”, new Object1)形式。,用反射方式執(zhí)行某個(gè)類中的main方法,目標(biāo): 寫一個(gè)程序,這個(gè)程序能夠根據(jù)用戶提供的類名,去執(zhí)行該類中的main方法。用普通方式調(diào)完后,大家要明白為什么要用反射方式去調(diào)??? 問題: 啟動(dòng)Java程序的main方法的參數(shù)是一個(gè)字符串?dāng)?shù)組,即public static void main(String args),通過反射方式來調(diào)用這個(gè)main方法時(shí),如何為invoke方法傳遞參數(shù)呢?按jdk1.5的語法,整個(gè)數(shù)組是一個(gè)參數(shù),而按jdk1.4的語法,數(shù)組中的每個(gè)元素對(duì)應(yīng)一個(gè)參數(shù),當(dāng)把一個(gè)字符串?dāng)?shù)組作為參數(shù)傳遞給invoke方法時(shí),javac會(huì)到底按照哪種語法進(jìn)行處理呢?jdk1.5肯定要兼容jdk1.4的語法,會(huì)按jdk1.4的語法進(jìn)行處理,即把數(shù)組打散成為若干個(gè)單獨(dú)的參數(shù)。所以,在給main方法傳遞參數(shù)時(shí),不能使用代碼mainMethod.invoke(null,new String“xxx”),javac只把它當(dāng)作jdk1.4的語法進(jìn)行理解,而不把它當(dāng)作jdk1.5的語法解釋,因此會(huì)出現(xiàn)參數(shù)類型不對(duì)的問題。 解決辦法: mainMethod.invoke(null,new Objectnew String“xxx“); mainMethod.invoke(null,(Object)new String“xxx”); 編譯器會(huì)作特殊處理,編譯時(shí)不把參數(shù)當(dāng)作數(shù)組看待,也就不會(huì)數(shù)組打散成若干個(gè)參數(shù)了。,內(nèi)省(Introspector) JavaBean,什么是JavaBean和屬性的讀寫方法? 訪問JavaBean屬性的兩種方式: 直接調(diào)用bean的setXXX或getXXX方法。 通過內(nèi)省技術(shù)訪問(java.beans包提供了內(nèi)省的API),內(nèi)省技術(shù)訪問也提供了兩種方式。 通過PropertyDescriptor類操作Bean的屬性 通過Introspector類獲得Bean對(duì)象的 BeanInfo,然后通過 BeanInfo 來獲取屬性的描述器( PropertyDescriptor ),通過這個(gè)屬性描述器就可以獲取某個(gè)屬性對(duì)應(yīng)的 getter/setter 方法,然后通過反射機(jī)制來調(diào)用這些方法。,方式一,User u = new User(); PropertyDescriptor pd = new PropertyDescriptor(“x“,User.class); Method m = pd.getWriteMethod(); m.invoke(u, 348); Method re = pd.getReadMethod(); System.out.println(re.invoke(u);,方式二,User u = new User(); BeanInfo info = Introspector.getBeanInfo(User.class); PropertyDescriptor pd = info.getPropertyDescriptors(); for (PropertyDescriptor temp:pd) String name = temp.getName(); System.out.println(name); ,內(nèi)省beanutils工具包,Apache組織開發(fā)了一套用于操作JavaBean的API,這套API考慮到了很多實(shí)際開發(fā)中的應(yīng)用場景,因此在實(shí)際開發(fā)中很多程序員使用這套API操作JavaBean,以簡化程序代碼的編寫。 Beanutils工具包的常用類: BeanUtils 有默認(rèn)的轉(zhuǎn)型機(jī)制 PropertyUtils.copyProperties( dest ,src) 屬性拷貝 ConvertUtils.regsiter(Converter convert, Class clazz) 自定義轉(zhuǎn)換器(常用轉(zhuǎn)換器) 案例 屬性設(shè)置 屬性拷貝,JavaSE中的路徑問題,相對(duì)路徑 絕對(duì)路徑 Class類 getResource(String name) getResourceAsStream(String name) 獲取相對(duì)路徑。 如果要取得一個(gè)非相對(duì)路徑下的資源,那么必須使用絕對(duì)路徑。 File(“絕對(duì)路徑”),泛型(Generic)泛形的作用(重點(diǎn)),JDK5以前,對(duì)象保存到集合中就會(huì)失去其特性,取出時(shí)通常要程序員手工進(jìn)行類型的強(qiáng)制轉(zhuǎn)換,這樣不可避免就會(huì)引發(fā)程序的一些安全性問題。例如:,ArrayList list = new ArrayList(); list.add(“abc“); Integer num = (Integer) list.get(0); / 運(yùn)行時(shí)會(huì)出錯(cuò),但編碼時(shí)發(fā)現(xiàn)不了 list.add(new Random(); list.add(new ArrayList(); for(int i=0;ilist.size();i+) (?)list.get(i); / 此處取出來的對(duì)象應(yīng)轉(zhuǎn)換成什么類型 ,泛型(Generic) 泛形的作用,JDK5中的泛形允許程序員在編寫集合代碼時(shí),就限制集合的處理類型,從而把原來程序運(yùn)行時(shí)可能發(fā)生問題,轉(zhuǎn)變?yōu)榫幾g時(shí)的問題,以此提高程序的可讀性和穩(wěn)定性(尤其在大型程序中更為突出)。 注意:泛型是提供給javac編譯器使用的,它用于限定集合的輸入類型,讓編譯器在源代碼級(jí)別上,即擋住向集合中插入非法數(shù)據(jù)。但編譯器編譯完帶有泛形的java程序后,生成的class文件中將不再帶有泛形信息,以此使程序運(yùn)行效率不受到影響,這個(gè)過程稱之為“擦除”。 泛形的基本術(shù)語,以ArrayList為例:念著typeof ArrayList中的E稱為類型參數(shù)變量 ArrayList中的Integer稱為實(shí)際類型參數(shù) 整個(gè)稱為ArrayList泛型類型 整個(gè)ArrayList稱為參數(shù)化的類型ParameterizedType,泛型典型應(yīng)用,使用迭代器迭代泛形集合中的元素。 使用增強(qiáng)for循環(huán)迭代泛形集合中的元素。 存取HashMap中的元素。 使用泛形時(shí)的幾個(gè)常見問題: 使用泛形時(shí),泛形類型須為引用類型,不能是基本數(shù)據(jù)類型 ArrayList list = new ArrayList(); ArrayList list = new ArrayList(); ArrayList list = new ArrayList(); ArrayList list = new ArrayList (); ArrayList list = new ArrayList();,自定義泛形泛型方法,Java程序中的普通方法、構(gòu)造方法和靜態(tài)方法中都可以使用泛型。方法使用泛形前,必須對(duì)泛形進(jìn)行聲明,語法: ,T可以是任意字母,但通常必須要大寫。通常需放在方法的返回值聲明之前。例如: public static void doxx(T t); 練習(xí): 編寫一個(gè)泛形方法,實(shí)現(xiàn)數(shù)組元素的交換。 編寫一個(gè)泛形方法,接收一個(gè)任意數(shù)組,并顛倒數(shù)組中的所有元素。 注意: 只有對(duì)象類型才能作為泛型方法的實(shí)際參數(shù)。 int 在泛型中可以同時(shí)有多個(gè)類型,例如: public static V getValue(K key) return map.get(key);,自定義泛形泛型類和反射泛形,如果一個(gè)類多處都要用到同一個(gè)泛型,這時(shí)可以把泛形定義在類上(即類級(jí)別的泛型),語法格式如下: public class GenericDao private T field1; public void save(T obj) public T getId(int id) 注意,靜態(tài)方法不能使用類定義的泛形,而應(yīng)單獨(dú)定義泛形。 泛形的典型應(yīng)用:BaseDao和反射泛型,泛型的高級(jí)應(yīng)用通配符,定義一個(gè)方法,接收一個(gè)集合,并打印出集合中的所有元素,如下所示:,void print (Collection c) for (Object e : c) System.out.println(e); ,問題:該方法只能打印保存了Object對(duì)象的集合,不能打印其它集合。通配符用于解決此類問題,方法的定義可改寫為如下形式:,void print (Collection c) /Collection(發(fā)音為:“collection of unknown“) for (Object e : c) System.out.println(e); ,此種形式下需要注意的是:由于print方法c參數(shù)的類型為Collection,即表示一種不確定的類型,因此在方法體內(nèi)不能調(diào)用與類型相關(guān)的方法,例如add()方法。 總結(jié):使用?通配符主要用于引用對(duì)象,使用了?通配符,就只能調(diào)對(duì)象與類型無關(guān)的方法,不能調(diào)用對(duì)象與類型有關(guān)的方法。,泛型的高級(jí)應(yīng)用有限制的通配符,限定通配符的上邊界:,正確:Vector x = new Vector(); 錯(cuò)誤:Vector x = new Vector();,限定通配符的下邊界:,正確:Vector x = new Vector(); 錯(cuò)誤:Vector x = new Vector();,public void add(List list) list.add(“abc“); ,問題:以下代碼行不行?,練習(xí),枚舉的練習(xí)(見前PPT) 反射,perties class =“” constructor=“” name=“” method=“”,User類,通過反射機(jī)制實(shí)現(xiàn)實(shí)例的創(chuàng)建,屬性、方法的訪問,Annotation(注解) 概述(重點(diǎn)),從 JDK 5.0 開始, Java 增加了對(duì)元數(shù)據(jù)(MetaData) 的支持, 也就是 Annotation(注解)。 什么是Annotation,以及注解的作用?三個(gè)基本的 Annotation: Override: 限定重寫父類方法, 該注解只能用于方法 Deprecated: 用于表示某個(gè)程序元素(類, 方法等)已過時(shí) SuppressWarnings: 抑制編譯器警告. Annotation 其實(shí)就是代碼里的特殊標(biāo)記, 它用于替代配置文件,也就是說,傳統(tǒng)方式通過配置文件告訴類如何運(yùn)行,有了注解技術(shù)后,開發(fā)人員可以通過注解告訴類如何運(yùn)行。在Java技術(shù)里注解的典型應(yīng)用是:可以通過反射技術(shù)去得到類里面的注解,以決定怎么去運(yùn)行類。 掌握注解技術(shù)的要點(diǎn): 如何定義注解 如何反射注解,并根據(jù)反射的注解信息,決定如何去運(yùn)行類,自定義 Annotation,定義新的 Annotation 類型使用 interface 關(guān)鍵字 聲明注解的屬性 注解屬性的作用:原來寫在配置文件中的信息,可以通過注解的屬性進(jìn)行描述。 屬性的類型可以是String/基本類型/枚舉/類/注解/數(shù)組 Annotation 的屬性聲明方式:String name(); 屬性默認(rèn)值聲明方式:String name() default “xxx”; 特殊屬性value:如果注解中有一個(gè)名稱value的屬性,那么使用注解時(shí)可以省略value=部分,如MyAnnotation(“xxx“) 特殊屬性value;,JDK 的元 Annotation,元 Annotation指修飾Annotation的Annotation。JDK中定義了如下元Annotation: Retention: 只能用于修飾一個(gè) Annotation 定義, 用于指定該 Annotation 可以保留的域, Rentention 包含一個(gè) RetentionPolicy 類型的成員變量, 通過這個(gè)變量指定域。 RetentionPolicy.SOURCE: 編譯器直接丟棄這種策略的注釋 RetentionPolicy.CLASS: 編譯器將把注解記錄在 class 文件中. 當(dāng)運(yùn)行 Java 程序時(shí), JVM 不會(huì)保留注解. 這是默認(rèn)值 RetentionPolicy.RUNTIME:編譯器將把注釋記錄在 class 文件中. 當(dāng)運(yùn)行 Java 程序時(shí), JVM 會(huì)保留注解. 程序可以通過反射獲取該注釋,JDK 的元 Annotation 2,Target:指定注解用于修飾類的哪個(gè)成員. Target 包含了一個(gè)名為 value,類型為ElementType的成員變量。 Documented: 用于指定被該元 Annotation 修飾的 Annotation 類將被 javadoc 工具提取成文檔. Inherited: 被它修飾的 Annotation 將具有繼承性.如果某個(gè)類使用了被 Inherited 修飾的 Annotation, 則其子類將自動(dòng)具有該注解,提取 Annotation 信息,JDK 5.0 在 java.lang.reflect 包下新增了 AnnotationElement 接口, 該接口代表程序中可以接受注釋的程序元素 當(dāng)一個(gè) Annotation 類型被定義為運(yùn)行時(shí) Annotation 后, 該注釋才是運(yùn)行時(shí)可見, 當(dāng) class 文件被載入時(shí)保存在 class 文件中的 Annotation 才會(huì)被虛擬機(jī)讀取 程序可以調(diào)用 AnnotationElement 對(duì)象的如下方法來訪問 Annotation 信息,北京傳智播客教育 ,Tip:動(dòng)態(tài)代理,明確兩個(gè)概念: 代理對(duì)象存在的價(jià)值:主要用于攔截對(duì)真實(shí)業(yè)務(wù)對(duì)象的訪問。 代理對(duì)象有什么方法? 現(xiàn)在要生成某一個(gè)對(duì)象的代理對(duì)象,這個(gè)代理對(duì)象通常也要編寫一個(gè)類來生成,所以首先要編寫用于生成代理對(duì)象的類。 如何編寫生成代理對(duì)象的類,兩個(gè)要素: 代理誰 如何生成代理對(duì)象 代理誰? 設(shè)計(jì)一個(gè)類變量,以及一個(gè)構(gòu)造函數(shù),記住代理類 代理哪個(gè)對(duì)象。 如何生成代理對(duì)象? 設(shè)計(jì)一個(gè)方法生成代理對(duì)象(在方法內(nèi)編寫代碼生成代理對(duì)象是此處編程的難點(diǎn)),北京傳智播客教育 ,Tip:動(dòng)態(tài)代理,Java提供了一個(gè)Proxy類,調(diào)用它的newInstance方法可以生成某個(gè)對(duì)象的代理對(duì)象,使用該方法生成代理對(duì)象時(shí),需要三個(gè)參數(shù): 1.生成代理對(duì)象使用哪個(gè)類裝載器 2.生成哪個(gè)對(duì)象的代理對(duì)象,通過接口指定 3.生成的代理對(duì)象的方法里干什么事,由開發(fā)人員編寫handler接口的實(shí)現(xiàn)來指定。 初學(xué)者必須理解,或不理解必須記住的2件事情: Proxy類負(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ì)象、自己(調(diào)用invoke方法的方法)、方法的參數(shù)傳遞進(jìn)來。,北京傳智播客教育 ,Tip:動(dòng)態(tà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ì)象,北京傳智播客教育 ,Tip:動(dòng)態(tài)代理應(yīng)用,在動(dòng)態(tài)代理技術(shù)里,由于不管用戶調(diào)用代理對(duì)象的什么方法,都是調(diào)用開發(fā)人員編寫的處理器的invoke方法(這相當(dāng)于invoke方法攔截到了代理對(duì)象的方法調(diào)用)。 并且,開發(fā)人員通過invoke方法的參數(shù),還可以在攔截的同時(shí),知道用戶調(diào)用的是什么方法,因此利用這兩個(gè)特性,就可以實(shí)現(xiàn)一些特殊需求,例如:攔截用戶的訪問請求,以檢查用戶是否有訪問權(quán)限、動(dòng)態(tài)為某個(gè)對(duì)象添加額外的功能。,類加載器,類加載器負(fù)責(zé)將 .class 文件(可能在磁盤上, 也可能在網(wǎng)絡(luò)上) 加載到內(nèi)存中, 并為之生成對(duì)應(yīng)的 java.lang.Class 對(duì)象 當(dāng) JVM 啟動(dòng)時(shí),會(huì)形成由三個(gè)類加載器組成的初始類加載器層次結(jié)構(gòu):,類加載器之間的父子關(guān)系和管轄范圍圖,BootStrap
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2026年家庭光儲(chǔ)融合項(xiàng)目公司成立分析報(bào)告
- 遼寧省普通高中2026年高中新課標(biāo)高三第一次摸底測試化學(xué)試題含解析
- 山東省青州二中2026年高三下學(xué)期第三周測試生物試題含解析
- 陜西省安康市漢濱高中2026年高三全真化學(xué)試題模擬試卷(8)含解析
- 遼寧省沈陽市五校協(xié)作體2026屆高三下學(xué)期第二次“戰(zhàn)疫”線上教學(xué)綜合測試生物試題含解析
- 陜西省榆林市2026年高三下學(xué)期質(zhì)檢考試化學(xué)試題含解析
- 吉林省輝煌聯(lián)盟九校2026年高三第二學(xué)期期末考試試題含解析
- 山大附屬中學(xué)2026年高三5月月考試題生物試題含解析
- 韶關(guān)市2026屆高三聯(lián)考生物試題含解析
- 高鐵基本知識(shí)
- 正念認(rèn)知療法實(shí)證研究-洞察及研究
- GJB2489A2023航空機(jī)載設(shè)備履歷本及產(chǎn)品合格證編制要求
- 2025年云南省中考英語試卷真題(含標(biāo)準(zhǔn)答案及解析)
- 海運(yùn)集貨倉庫管理制度
- 熱點(diǎn)話題18 航天新征程:神舟二十號(hào)引領(lǐng)科技創(chuàng)新與傳統(tǒng)突破-2025年高考語文作文主題預(yù)測+素材+模擬范文
- 2024年3月浙江省高中生物競賽試卷 含解析
- DBJ50-T-274-2017 重慶市軌道交通客運(yùn)服務(wù)標(biāo)志標(biāo)準(zhǔn)
- 五年級(jí)數(shù)學(xué)(小數(shù)除法)計(jì)算題專項(xiàng)練習(xí)及答案匯編
- 人教版八年級(jí)下冊物理期末考試試卷含答案
- 妊娠期乳腺癌護(hù)理
- 糖皮質(zhì)激素在兒科疾病中的合理應(yīng)用3
評(píng)論
0/150
提交評(píng)論