版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、Chapter1本章任務(wù)本章任務(wù)使用反射技術(shù)獲取類的結(jié)構(gòu)信息使用反射技術(shù)獲取類的結(jié)構(gòu)信息使用反射技術(shù)使用反射技術(shù)動態(tài)創(chuàng)建對象動態(tài)創(chuàng)建對象動態(tài)修改查詢屬性值動態(tài)修改查詢屬性值動態(tài)執(zhí)行方法動態(tài)執(zhí)行方法動態(tài)創(chuàng)建數(shù)組并存取元素動態(tài)創(chuàng)建數(shù)組并存取元素使用靜態(tài)代理實現(xiàn)添加日志功能使用靜態(tài)代理實現(xiàn)添加日志功能使用動態(tài)代理實現(xiàn)添加日志功能使用動態(tài)代理實現(xiàn)添加日志功能本章目標(biāo)本章目標(biāo)Java反射技術(shù)反射技術(shù)反射技術(shù)的引入反射技術(shù)的引入反射技術(shù)的入口類反射技術(shù)的入口類Class反射技術(shù)的具體內(nèi)容反射技術(shù)的具體內(nèi)容動態(tài)創(chuàng)建對象動態(tài)創(chuàng)建對象動態(tài)修改查詢屬性值動態(tài)修改查詢屬性值動態(tài)執(zhí)行方法動態(tài)執(zhí)行方法動態(tài)創(chuàng)建數(shù)組并存取
2、元素動態(tài)創(chuàng)建數(shù)組并存取元素反射技術(shù)優(yōu)缺點反射技術(shù)優(yōu)缺點代理模式代理模式靜態(tài)代理靜態(tài)代理動態(tài)代理動態(tài)代理反射技術(shù)的引入反射技術(shù)的引入4-1編譯和運行時都知道類和對象的具體信息,此編譯和運行時都知道類和對象的具體信息,此時直接對類和對象進(jìn)行操作即可,無需反射時直接對類和對象進(jìn)行操作即可,無需反射public class WhyClass public void method1( Student stu1 ) Student stu2 = new Student(); = lkl;stu2.setAge(stu1.getAge();System.out.println(stu2.n
3、ame);System.out.println(stu2.getAge();傳入傳入Student類,而不類,而不是其他類是其他類反射技術(shù)的引入反射技術(shù)的引入4-2如果編譯和運行時不知道類和對象的具體信息,如果編譯和運行時不知道類和對象的具體信息,此時應(yīng)該如何做呢?此時應(yīng)該如何做呢?public class WhyClass public void method2( String str ) throws Exception Class clazz = Class.forName(str);Object obj = clazz.newInstance();Field fs = clazz.ge
4、tFields();Method ms = clazz.getMethods();public static void main(String args) throws Exception WhyClass t = new WhyClass();t.method2(java.lang.String);t.method2(cn.jbit.reflection.Student);t.method2(java.util.Date);使用反射技術(shù)來實現(xiàn)使用反射技術(shù)來實現(xiàn)實參:傳入具體的類名實參:傳入具體的類名形參:動態(tài)傳入類名形參:動態(tài)傳入類名反射的應(yīng)用場合反射的應(yīng)用場合在編譯時根本無法知道該對象或類
5、可能屬于哪些類,在編譯時根本無法知道該對象或類可能屬于哪些類,程序只依靠運行時信息來發(fā)現(xiàn)該對象和類的真實信程序只依靠運行時信息來發(fā)現(xiàn)該對象和類的真實信息息反射的作用反射的作用通過反射可以使程序代碼訪問裝載到通過反射可以使程序代碼訪問裝載到JVM 中的類的中的類的內(nèi)部信息內(nèi)部信息獲取已裝載類的屬性信息獲取已裝載類的屬性信息獲取已裝載類的方法獲取已裝載類的方法獲取已裝載類的構(gòu)造方法信息獲取已裝載類的構(gòu)造方法信息反射技術(shù)的引入反射技術(shù)的引入4-3在在JDK中,主要由以下類來實現(xiàn)中,主要由以下類來實現(xiàn)Java反射機(jī)制,反射機(jī)制,這些類都位于這些類都位于java.lang.reflect包中包中Clas
6、s類:代表一個類類:代表一個類Field 類:代表類的成員變量類:代表類的成員變量(屬性屬性)Method類:代表類的成員方法類:代表類的成員方法Constructor 類:代表類的構(gòu)造方法類:代表類的構(gòu)造方法Array類:提供了動態(tài)創(chuàng)建數(shù)組,以及訪問數(shù)組的元素類:提供了動態(tài)創(chuàng)建數(shù)組,以及訪問數(shù)組的元素的靜態(tài)方法的靜態(tài)方法反射技術(shù)的引入反射技術(shù)的引入4-4Class類是類是Java 反射機(jī)制的起源和入口反射機(jī)制的起源和入口用于獲取與類相關(guān)的各種信息用于獲取與類相關(guān)的各種信息提供了獲取類信息的相關(guān)方法提供了獲取類信息的相關(guān)方法Class類繼承自類繼承自O(shè)bject類類Class類是所有類的共同的
7、圖紙類是所有類的共同的圖紙每個類有自己的對象,好比圖紙和實物的關(guān)系每個類有自己的對象,好比圖紙和實物的關(guān)系每個類也可看做是一個對象,有共同的圖紙每個類也可看做是一個對象,有共同的圖紙Class,存放類的存放類的結(jié)構(gòu)信息,結(jié)構(gòu)信息,能夠通過相應(yīng)方法取出相應(yīng)信息能夠通過相應(yīng)方法取出相應(yīng)信息類的名字類的名字屬性屬性方法方法構(gòu)造方法構(gòu)造方法父類和接口父類和接口反射技術(shù)的入口類反射技術(shù)的入口類Class5-1反射技術(shù)的入口類反射技術(shù)的入口類Class5-2Class類的常用方法類的常用方法文件名說 明getFields()獲得類的獲得類的publicpublic類型的屬性。類型的屬性。getDeclar
8、edFields()獲得類的所有屬性獲得類的所有屬性 getField(String name)獲得類的指定屬性獲得類的指定屬性getMethods()獲得類的獲得類的publicpublic類型的方法類型的方法getMethod (String name,Class args)獲得類的指定方法獲得類的指定方法getConstrutors()獲得類的獲得類的publicpublic類型的構(gòu)造方法類型的構(gòu)造方法getConstrutor(Class args)獲得類的特定構(gòu)造方法獲得類的特定構(gòu)造方法newInstance()通過類的無參構(gòu)造方法創(chuàng)建該類的一個對象通過類的無參構(gòu)造方法創(chuàng)建該類的一個
9、對象getName()獲得類的完整名字獲得類的完整名字getPackage()獲取此類所屬的包獲取此類所屬的包getSuperclass()獲得此類的父類對應(yīng)的獲得此類的父類對應(yīng)的ClassClass對象對象反射技術(shù)的入口類反射技術(shù)的入口類Class5-3public class TestClass public static void main(String args) throws Exception Class clazz = Class.forName(java.lang.Object);/ Class clazz = Class.forName(java.lang.String);S
10、ystem.out.println(-類的字段類的字段-);Field fields = clazz.getDeclaredFields();for (Field field : fields)System.out.println(field.getName() + + field.getType();System.out.println(-類的方法類的方法-);Method methods = clazz.getDeclaredMethods();for (Method method : methods)System.out.println(method.getName();System.o
11、ut.println(-類的構(gòu)造方法類的構(gòu)造方法-);Constructor constructors = clazz.getDeclaredConstructors();for (Constructor constructor : constructors) System.out.println(constructor);System.out.println(-類所在包、完整名稱、父類類所在包、完整名稱、父類-);System.out.println(clazz.getPackage().getName();System.out.println(clazz.getName();System.
12、out.println(clazz.getSuperclass();演示示例:使用演示示例:使用Class類獲取類的結(jié)構(gòu)信息類獲取類的結(jié)構(gòu)信息反射技術(shù)的入口類反射技術(shù)的入口類Class5-4為一個為一個class生成對應(yīng)的生成對應(yīng)的Class對象對象方 法示 例對象名對象名.getClass()String str=bdqn;String str=bdqn;Class clazz = str.getClass();Class clazz = str.getClass();對象名對象名.getSuperClass()Student stu = new Student();Student stu
13、= new Student();Class c1 = stu.getClass();Class c1 = stu.getClass();Class c2 = stu.getSuperClass();Class c2 = stu.getSuperClass();Class.forName()Class clazz = Class.forName(java.lang.Object);Class clazz = Class.forName(java.lang.Object);Class.forName(Class.forName(oracle.jdbc.driver.OracleDriverorac
14、le.jdbc.driver.OracleDriver););類名類名.classClass c1 = String.class;Class c1 = String.class;Class c2 = Student.class;Class c2 = Student.class;Class c2 = int.classClass c2 = int.class包裝類包裝類.TYPEClass c1 = Integer.TYPE;Class c1 = Integer.TYPE;Class c2 = Boolean.TYPE;Class c2 = Boolean.TYPE;反射技術(shù)的入口類反射技術(shù)的入
15、口類Class5-5public class TestClass2 public static void main(String args) throws ClassNotFoundException /方法方法1:對象:對象.getClass()Student stu=new Student();Class clazz=stu.getClass();String str=Hello World;clazz=str.getClass();/方法方法2:類:類.classclazz= Student.class;clazz=String.class;clazz=Integer.class;cla
16、zz =int.class;/方法方法3:Class.forName()clazz=Class.forName(java.lang.String);clazz=Class.forName(java.util.Date);/方法方法4:包裝類:包裝類.TYPEclazz=Integer.TYPE;clazz=Void.TYPE;演示示例:生成一個類的演示示例:生成一個類的Class對象對象方法方法1:通過:通過Class的的newInstance()方法方法該方法要求該該方法要求該Class對象的對應(yīng)類有無參構(gòu)造方法對象的對應(yīng)類有無參構(gòu)造方法執(zhí)行執(zhí)行newInstance()實際上就是執(zhí)行無參構(gòu)
17、造方法來實際上就是執(zhí)行無參構(gòu)造方法來創(chuàng)建該類的實例創(chuàng)建該類的實例使用反射動態(tài)創(chuàng)建對象使用反射動態(tài)創(chuàng)建對象2-1public class ConstructorTest public static void main(String args) throws Exception /方法方法1:調(diào)用:調(diào)用Class的的newInstance方法,僅適用于無參構(gòu)造方法方法,僅適用于無參構(gòu)造方法Class clazz=Class.forName(cn.jbit.reflection.Student);Object obj=clazz.newInstance();相當(dāng)于執(zhí)行語句:相當(dāng)于執(zhí)行語句: Stud
18、ent stu = new Student();方法方法2:通過:通過Constructor的的newInstance()方法方法先使用先使用Class對象獲取指定的對象獲取指定的Constructor對象對象再調(diào)用再調(diào)用Constructor對象的對象的newInstance()方法來創(chuàng)建方法來創(chuàng)建該該Class對象對應(yīng)類的對象對象對應(yīng)類的對象通過該方法可選擇使用指定構(gòu)造方法來創(chuàng)建對象通過該方法可選擇使用指定構(gòu)造方法來創(chuàng)建對象使用反射動態(tài)創(chuàng)建對象使用反射動態(tài)創(chuàng)建對象2-2public class ConstructorTest public static void main(String a
19、rgs) throws Exception / 方法方法2:調(diào)用:調(diào)用Constructor的的newInstance方法,適用所有構(gòu)造方法方法,適用所有構(gòu)造方法Class clazz = Class.forName(cn.jbit.reflection.Student);Constructor cons = clazz.getConstructor(new Class String.class,int.class, float.class );Object obj = cons.newInstance(new Object lkl, 32, 56.5f );System.out.printl
20、n(obj); /也可以調(diào)用無參構(gòu)造方法,只是比方法也可以調(diào)用無參構(gòu)造方法,只是比方法1復(fù)雜復(fù)雜obj=clazz.getConstructor(new Class).newInstance(new Object);obj=clazz.getConstructor().newInstance();System.out.println(obj);演示示例:使用反射動態(tài)創(chuàng)建對象演示示例:使用反射動態(tài)創(chuàng)建對象相當(dāng)于執(zhí)行語句:相當(dāng)于執(zhí)行語句: Student stu=new Student(lkl,32,56.5f);相當(dāng)于執(zhí)行語句:相當(dāng)于執(zhí)行語句: Student stu=new Student()
21、;練習(xí)練習(xí)Class類和類和Constructor類類需求說明:需求說明:使用多種方法生成一個使用多種方法生成一個Student類的類的Class對象對象使用使用Class類獲取類獲取String和和Student類的結(jié)構(gòu)信類的結(jié)構(gòu)信息并輸出息并輸出使用反射技術(shù)動態(tài)創(chuàng)建使用反射技術(shù)動態(tài)創(chuàng)建Student類的對象類的對象通過無參構(gòu)造方法通過無參構(gòu)造方法通過有參構(gòu)造方法通過有參構(gòu)造方法實現(xiàn)步驟實現(xiàn)步驟參考本專題實現(xiàn)步驟和代碼參考本專題實現(xiàn)步驟和代碼完成時間:完成時間:25分鐘分鐘共性問題集中講解共性問題集中講解n常見調(diào)試問題及解決辦法常見調(diào)試問題及解決辦法n代碼規(guī)范問題代碼規(guī)范問題共性問題集中講解
22、共性問題集中講解通過通過Class對象的對象的getFields()或者或者getField()方法可以獲方法可以獲得該類所包括的全部得該類所包括的全部Field屬性或指定屬性或指定Field屬性。屬性。Field類提供了以下方法來訪問屬性類提供了以下方法來訪問屬性getXxx(Object obj):獲?。韩@取obj對象該對象該Field的屬性值。此處的的屬性值。此處的Xxx對應(yīng)對應(yīng)8個基本數(shù)據(jù)類型,如果該屬性類型是引用類型則直接個基本數(shù)據(jù)類型,如果該屬性類型是引用類型則直接使用使用get(Object obj)setXxx(Object obj,Xxx val):將:將obj對象的該對象的
23、該Field賦值賦值val。此處的此處的Xxx對應(yīng)對應(yīng)8個基本數(shù)據(jù)類型,如果該屬性類型是引用類型個基本數(shù)據(jù)類型,如果該屬性類型是引用類型則直接使用則直接使用set(Object obj, Object val)setAccessible(Boolean flag):若:若flag為為true,則取消屬性的,則取消屬性的訪問權(quán)限控制,即使訪問權(quán)限控制,即使private屬性也可以進(jìn)行訪問屬性也可以進(jìn)行訪問使用反射動態(tài)修改查詢屬性值使用反射動態(tài)修改查詢屬性值2-1使用反射動態(tài)修改查詢屬性值使用反射動態(tài)修改查詢屬性值2-2public class FieldTest public static vo
24、id main(String args) throws Exception Class clazz = Class.forName(cn.jbit.reflection.Student);Object obj = clazz.newInstance();/ 調(diào)用調(diào)用getDeclaredField(name) 取得取得name屬性對應(yīng)的屬性對應(yīng)的Field對象對象Field f = clazz.getDeclaredField(name);/ 取消屬性的訪問權(quán)限控制,即使取消屬性的訪問權(quán)限控制,即使private屬性也可以進(jìn)行訪問。屬性也可以進(jìn)行訪問。f.setAccessible(true)
25、;/ 調(diào)用調(diào)用get()方法取得對應(yīng)屬性值。方法取得對應(yīng)屬性值。System.out.println(f.get(obj); /相當(dāng)于相當(dāng)于obj.getName();/ 調(diào)用調(diào)用set()方法給對應(yīng)屬性賦值。方法給對應(yīng)屬性賦值。f.set(obj, lkl); /相當(dāng)于相當(dāng)于obj.setName(lkl); / 調(diào)用調(diào)用get()方法取得對應(yīng)屬性修改后的值。方法取得對應(yīng)屬性修改后的值。System.out.println(f.get(obj);演示示例:使用反射動態(tài)修改和查詢屬性值演示示例:使用反射動態(tài)修改和查詢屬性值通過通過Class對象的對象的getMethods() 方法可以獲得方法
26、可以獲得該類所包括的全部方法該類所包括的全部方法, 返回值是返回值是Method通過通過Class對象的對象的getMethod()方法可以獲得該方法可以獲得該類所包括的指定方法類所包括的指定方法, 返回值是返回值是Method每個每個Method對象對應(yīng)一個方法,獲得對象對應(yīng)一個方法,獲得Method對象后,可以調(diào)用其對象后,可以調(diào)用其invoke() 來調(diào)用對應(yīng)方法來調(diào)用對應(yīng)方法Object invoke(Object obj,Object args):obj代表代表當(dāng)前方法所屬的對象的名字,當(dāng)前方法所屬的對象的名字,args代表當(dāng)前方法的代表當(dāng)前方法的參數(shù)列表,返回值參數(shù)列表,返回值Ob
27、ject是當(dāng)前方法的返回值,即是當(dāng)前方法的返回值,即執(zhí)行當(dāng)前方法的結(jié)果。執(zhí)行當(dāng)前方法的結(jié)果。使用反射動態(tài)執(zhí)行方法使用反射動態(tài)執(zhí)行方法2-1使用反射動態(tài)執(zhí)行方法使用反射動態(tài)執(zhí)行方法2-2public class TestMethod public int add(int x, int y) return x + y;public void shout(String name) System.out.println(my name is+name);public static void main(String args) throws Exception / 創(chuàng)建該類的一個對象創(chuàng)建該類的一個對象C
28、lass clazz = TestMethod.class;Object obj = clazz.newInstance();/ 調(diào)用該對象的調(diào)用該對象的add方法方法Method amethod=clazz.getMethod(add,new Classint.class, int.class);Object result = amethod.invoke(obj, new Object 5, 7 );System.out.println(result);/ 調(diào)用該對象的調(diào)用該對象的shout方法方法Method smethod=clazz.getMethod(shout,new Class
29、String.class);smethod.invoke(obj, new Object lkl );演示示例:使用反射動態(tài)執(zhí)行方法演示示例:使用反射動態(tài)執(zhí)行方法相當(dāng)于執(zhí)行語句:相當(dāng)于執(zhí)行語句:TestMethod tm=new TestMethod();int sum=tm.add(5, 7);System.out.println(sum);tm.shout(lkl);練習(xí)練習(xí)Field類和類和Method類類需求說明:需求說明:使用反射修改和查詢使用反射修改和查詢Student類的類的name屬性屬性使用反射動態(tài)執(zhí)行使用反射動態(tài)執(zhí)行TestMethod類的類的add方法和方法和shout方
30、法方法實現(xiàn)步驟實現(xiàn)步驟參考本專題實現(xiàn)步驟和代碼參考本專題實現(xiàn)步驟和代碼完成時間:完成時間:20分鐘分鐘共性問題集中講解共性問題集中講解n常見調(diào)試問題及解決辦法常見調(diào)試問題及解決辦法n代碼規(guī)范問題代碼規(guī)范問題共性問題集中講解共性問題集中講解在在java.lang.reflect包下提供了包下提供了Array類,包括類,包括一系列一系列static方法,通過這些方法可動態(tài)的創(chuàng)建方法,通過這些方法可動態(tài)的創(chuàng)建數(shù)組、給元素賦值、取出元素值等數(shù)組、給元素賦值、取出元素值等Array提供的主要方法如下:提供的主要方法如下:static Object newInstance(Class componentT
31、ype, int dim) :創(chuàng)建一個具有指定的:創(chuàng)建一個具有指定的組件類型和維度的新數(shù)組組件類型和維度的新數(shù)組static void setXxx(Object array, int index ,xxx val):給數(shù)組對象:給數(shù)組對象array中第中第index個元素賦值個元素賦值valstatic xxx getXxx(Object array, int index):以:以 xxx形式返回指定數(shù)組對象形式返回指定數(shù)組對象array中第中第index個元素值個元素值使用反射動態(tài)創(chuàng)建數(shù)組并存取元素使用反射動態(tài)創(chuàng)建數(shù)組并存取元素3-1使用反射動態(tài)創(chuàng)建數(shù)組并存取元素使用反射動態(tài)創(chuàng)建數(shù)組并存取
32、元素3-2public class ArrayTest1 public static void main(String args) throws Exception / 創(chuàng)建一個含有創(chuàng)建一個含有10個元素的整型數(shù)組個元素的整型數(shù)組Class clazz = Class.forName(java.lang.Integer);Object arr = Array.newInstance(clazz, 10);/ Object arr=Array.newInstance(Integer.TYPE, 10);/ 給第五個元素賦值給第五個元素賦值A(chǔ)rray.set(arr, 5, 20);/ Array
33、.setInt(arr, 5, 20);/ 取出第五個元素值并輸出取出第五個元素值并輸出Object elem = Array.get(arr, 5);System.out.println(elem);演示示例:使用反射動態(tài)創(chuàng)建一維數(shù)組并存取元素演示示例:使用反射動態(tài)創(chuàng)建一維數(shù)組并存取元素相當(dāng)于執(zhí)行語句:相當(dāng)于執(zhí)行語句: int arr=new int10; arr5=20; System.out.println(arr5);使用反射動態(tài)創(chuàng)建數(shù)組并存取元素使用反射動態(tài)創(chuàng)建數(shù)組并存取元素3-3public class ArrayTest2 public static void main(Stri
34、ng args) throws Exception / 創(chuàng)建一個含有創(chuàng)建一個含有10*15*18個元素的整型數(shù)組個元素的整型數(shù)組int dims = 10, 15, 18 ;Object arr = Array.newInstance(int.class, dims);/ 給給arr5810賦值賦值Object arr5 = Array.get(arr, 5);Object arr58 = Array.get(arr5, 8);Array.set(arr58, 10, 30);/ 取出取出arr5810值并輸出值并輸出Object elem = Array.get(arr58, 10);Sys
35、tem.out.println(elem);演示示例:使用反射動態(tài)創(chuàng)建多維數(shù)組并存取元素演示示例:使用反射動態(tài)創(chuàng)建多維數(shù)組并存取元素相當(dāng)于執(zhí)行語句:相當(dāng)于執(zhí)行語句: int arr =new int101518; arr5810=20; System.out.println(arr5810);練習(xí)練習(xí)Array類類需求說明:需求說明:使用反射動態(tài)創(chuàng)建一維整型數(shù)組并存取元素使用反射動態(tài)創(chuàng)建一維整型數(shù)組并存取元素使用反射動態(tài)創(chuàng)建多維整型數(shù)組并存取元素使用反射動態(tài)創(chuàng)建多維整型數(shù)組并存取元素實現(xiàn)步驟實現(xiàn)步驟參考本專題實現(xiàn)步驟和代碼參考本專題實現(xiàn)步驟和代碼完成時間:完成時間:20分鐘分鐘共性問題集中講解
36、共性問題集中講解n常見調(diào)試問題及解決辦法常見調(diào)試問題及解決辦法n代碼規(guī)范問題代碼規(guī)范問題共性問題集中講解共性問題集中講解反射提高了反射提高了Java程序的靈活性和擴(kuò)展性,降低耦程序的靈活性和擴(kuò)展性,降低耦合性,提高自適應(yīng)能力。它允許程序創(chuàng)建和控制合性,提高自適應(yīng)能力。它允許程序創(chuàng)建和控制任何類的對象,無需提前硬編碼目標(biāo)類任何類的對象,無需提前硬編碼目標(biāo)類反射是其它一些常用語言,如反射是其它一些常用語言,如C、C+、Fortran 或者或者Pascal等都不具備的等都不具備的Java反射技術(shù)應(yīng)用領(lǐng)域很廣,如軟件測試、反射技術(shù)應(yīng)用領(lǐng)域很廣,如軟件測試、 EJB、JavaBean等等許多流行的開源框
37、架例如許多流行的開源框架例如Struts、Hibernate、Spring在實現(xiàn)過程中都采用了該技術(shù)在實現(xiàn)過程中都采用了該技術(shù)反射技術(shù)優(yōu)缺點反射技術(shù)優(yōu)缺點2-1反射的缺點反射的缺點性能問題性能問題使用反射基本上是一種解釋操作,用于字段和方法接入時使用反射基本上是一種解釋操作,用于字段和方法接入時要遠(yuǎn)慢于直接代碼。因此要遠(yuǎn)慢于直接代碼。因此Java反射機(jī)制主要應(yīng)用在對靈活反射機(jī)制主要應(yīng)用在對靈活性和擴(kuò)展性要求很高的系統(tǒng)框架上性和擴(kuò)展性要求很高的系統(tǒng)框架上,普通程序不建議使用。普通程序不建議使用。使用反射會模糊程序內(nèi)部邏輯使用反射會模糊程序內(nèi)部邏輯程序人員希望在源代碼中看到程序的邏輯,反射等繞過了
38、程序人員希望在源代碼中看到程序的邏輯,反射等繞過了源代碼的技術(shù),因而會帶來維護(hù)問題。反射代碼比相應(yīng)的源代碼的技術(shù),因而會帶來維護(hù)問題。反射代碼比相應(yīng)的直接代碼更復(fù)雜。直接代碼更復(fù)雜。反射技術(shù)優(yōu)缺點反射技術(shù)優(yōu)缺點2-2小結(jié)小結(jié)Java反射技術(shù)的主要實現(xiàn)類有哪些,其作用分別反射技術(shù)的主要實現(xiàn)類有哪些,其作用分別是什么?是什么?生成一個生成一個Class對象的方法主要有哪些?對象的方法主要有哪些?getFields()和和getDeclaredFields()有什么區(qū)別?有什么區(qū)別?反射技術(shù)的優(yōu)缺點有哪些?反射技術(shù)的優(yōu)缺點有哪些?代理模式簡介代理模式簡介2-1代理模式是代理模式是23中設(shè)計模式之一中
39、設(shè)計模式之一代理模式的作用代理模式的作用為其他對象提供一種代理以控制對目標(biāo)對象的訪問。為其他對象提供一種代理以控制對目標(biāo)對象的訪問。某些情況下客戶不想或不能直接引用另一個對象,而某些情況下客戶不想或不能直接引用另一個對象,而代理對象可在客戶端和目標(biāo)對象間起到中介作用代理對象可在客戶端和目標(biāo)對象間起到中介作用代理模式的分類代理模式的分類靜態(tài)代理靜態(tài)代理動態(tài)代理動態(tài)代理代理模式簡介代理模式簡介2-2代理模式一般涉及到的角色代理模式一般涉及到的角色抽象角色:真實對象和代理對象的共同接口抽象角色:真實對象和代理對象的共同接口真實角色:真實對象,最終要引用的對象真實角色:真實對象,最終要引用的對象代理角
40、色代理角色內(nèi)部含有對真實對象的引用,從而可以操作真實對象內(nèi)部含有對真實對象的引用,從而可以操作真實對象提供與真實對象相同的接口以便在任何時刻代替真實對象提供與真實對象相同的接口以便在任何時刻代替真實對象可在執(zhí)行真實對象操作前后附加其他操作,相當(dāng)于對真實對可在執(zhí)行真實對象操作前后附加其他操作,相當(dāng)于對真實對象進(jìn)行封裝象進(jìn)行封裝InterfaceSubject+ operation1+ operation2-Subject subjectProxy+ operation1+ operation2RealSubject+ operation1+ operation2靜態(tài)代理靜態(tài)代理5-1抽象角色抽象
41、角色/* * 學(xué)生管理接口學(xué)生管理接口 * author 北大青鳥北大青鳥 * */public interface StuManager /* * 按照指定按照指定id刪除學(xué)生刪除學(xué)生 * param id */public void deleteStu(int id);/* * 查詢指定查詢指定id的學(xué)生的學(xué)生 * param id * return */public String selectStu(int id);靜態(tài)代理靜態(tài)代理5-2真實角色真實角色/* * 學(xué)生管理實現(xiàn)類學(xué)生管理實現(xiàn)類 * author 北大青鳥北大青鳥 */public class StuManagerImpl
42、implements StuManager public void deleteStu(int id) System.out.println(deleteStu);public String selectStu(int id) System.out.println(selectStu);return lkl;靜態(tài)代理靜態(tài)代理5-3代理角色代理角色/ 學(xué)生管理靜態(tài)代理類學(xué)生管理靜態(tài)代理類, 在進(jìn)行操作前記錄操作日志在進(jìn)行操作前記錄操作日志 public class StuManagerSproxy implements StuManager StuManager stumanager;publi
43、c StuManagerSproxy() this.stumanager = new StuManagerImpl();public void deleteStu(int id) log(deleteStu);stumanager.deleteStu(id);public String selectStu(int id) log(selectStu);return stumanager.selectStu(id);public void log(String oper)System.out.println(log before execute + oper);含有對真實對象的引用含有對真實對象
44、的引用刪除操作之前添加日志刪除操作之前添加日志查詢操作之前添加日志查詢操作之前添加日志記錄操作日志記錄操作日志靜態(tài)代理靜態(tài)代理5-4測試類測試類public class Test public static void main(String args) System.out.println(-不使用靜態(tài)代理進(jìn)行操作不使用靜態(tài)代理進(jìn)行操作-);/創(chuàng)建目標(biāo)類對象,不使用靜態(tài)代理創(chuàng)建目標(biāo)類對象,不使用靜態(tài)代理StuManager sm1=new StuManagerImpl();/刪除指定刪除指定id學(xué)生學(xué)生sm1.deleteStu(5);/查詢指定查詢指定id學(xué)生信息學(xué)生信息System.out
45、.println(sm1.selectStu(5);System.out.println(-使用靜態(tài)代理進(jìn)行操作使用靜態(tài)代理進(jìn)行操作-);/創(chuàng)建靜態(tài)代理類對象創(chuàng)建靜態(tài)代理類對象StuManager sm2=new StuManagerSproxy();/刪除指定刪除指定id學(xué)生學(xué)生sm2.deleteStu(5);/查詢指定查詢指定id學(xué)生信息學(xué)生信息System.out.println(sm2.selectStu(5);演示示例:使用靜態(tài)代理實現(xiàn)添加日志功能演示示例:使用靜態(tài)代理實現(xiàn)添加日志功能靜態(tài)代理靜態(tài)代理5-5優(yōu)點優(yōu)點不需要修改目標(biāo)對象就實現(xiàn)了功能的增加不需要修改目標(biāo)對象就實現(xiàn)了功能的
46、增加缺點缺點真實角色必須是事先已經(jīng)存在的,并將其作為代理真實角色必須是事先已經(jīng)存在的,并將其作為代理對象的內(nèi)部屬性。如果事先并不知道真實角色則無對象的內(nèi)部屬性。如果事先并不知道真實角色則無法使用法使用一個真實角色必須對應(yīng)一個代理角色,如果大量使一個真實角色必須對應(yīng)一個代理角色,如果大量使用會導(dǎo)致類的急劇膨脹用會導(dǎo)致類的急劇膨脹如果事先并不知道真實角色,該如何使用代理呢?如果事先并不知道真實角色,該如何使用代理呢?動態(tài)代理動態(tài)代理動態(tài)代理動態(tài)代理6-1Java動態(tài)代理類位于動態(tài)代理類位于java.lang.reflect包下,包下,主要涉及到以下兩個類主要涉及到以下兩個類InvocationHa
47、ndler接口接口Proxy類類InvocationHandler接口僅定義了一個方法接口僅定義了一個方法public object invoke(Object obj,Method method, Object args)obj一般是指代理類一般是指代理類method是被代理的方法是被代理的方法args為該方法的參數(shù)數(shù)組為該方法的參數(shù)數(shù)組 這個抽象方法在代理類中動態(tài)實現(xiàn)這個抽象方法在代理類中動態(tài)實現(xiàn)動態(tài)代理動態(tài)代理6-2Proxy類即為動態(tài)代理類,主要方法包括類即為動態(tài)代理類,主要方法包括protected Proxy(InvocationHandler h) 構(gòu)造函數(shù),用于給內(nèi)部的構(gòu)造函數(shù)
48、,用于給內(nèi)部的h賦值賦值static Object newProxyInstance(ClassLoader loader, Class interfaces, InvocationHandler h) 返回代理類的一個實例返回代理類的一個實例loader是類裝載器是類裝載器interfaces是真實類所擁有的全部接口的數(shù)組是真實類所擁有的全部接口的數(shù)組static Class getProxyClass (ClassLoader loader, Class interfaces) 獲得一個代理類獲得一個代理類動態(tài)代理動態(tài)代理6-3抽象角色和真實角色抽象角色和真實角色為方便起見,采用了和靜態(tài)代
49、理相同的類為方便起見,采用了和靜態(tài)代理相同的類但必須明確一個動態(tài)代理類可適用多個抽象角色和但必須明確一個動態(tài)代理類可適用多個抽象角色和真實角色真實角色/* * 學(xué)生管理接口學(xué)生管理接口 * author 北大青鳥北大青鳥 * */public interface StuManager /* * 按照指定按照指定id刪除學(xué)生刪除學(xué)生 * param id */public void deleteStu(int id);/* * 查詢指定查詢指定id的學(xué)生的學(xué)生 * param id * return */public String selectStu(int id);/* * 學(xué)生管理實現(xiàn)類學(xué)生
50、管理實現(xiàn)類 * author 北大青鳥北大青鳥 */public class StuManagerImpl implements StuManager public void deleteStu(int id) System.out.println(deleteStu);public String selectStu(int id) System.out.println(selectStu);return lkl;動態(tài)代理動態(tài)代理6-4定義定義LogHandler包含對真實對象的引用包含對真實對象的引用實現(xiàn)實現(xiàn)InvocationHandler 接口接口返回動態(tài)代理對象返回動態(tài)代理對象public class LogHandler implements InvocationHandler Object target; public LogHandler(Object target) this.target = target;public Object invoke(Object proxy, Method method, Object args)throws Throwable if (method.getName().equals(deleteStu) log();Object result = method.invoke(target, args)
溫馨提示
- 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 課程設(shè)計實現(xiàn)分層教學(xué)
- 采暖鍋爐除塵課程設(shè)計
- 2024至2030年絲光綢緞布項目投資價值分析報告
- 2024年小型直驅(qū)式離心排氣扇項目可行性研究報告
- 2025年中國水箱右上架板市場調(diào)查研究報告
- 課程設(shè)計 團(tuán)隊合作
- 遙感技術(shù)及運用課程設(shè)計
- 系統(tǒng)推拿課程設(shè)計書
- 營銷項目管理課程設(shè)計
- 樂器聲音與情感表達(dá)的關(guān)聯(lián)考核試卷
- 2024版Amazon店鋪代運營與品牌授權(quán)及維權(quán)服務(wù)合同3篇
- 影視作品價值評估-洞察分析
- 全國醫(yī)療服務(wù)價格項目規(guī)范(2012年版)-工作手冊
- 水庫蓄水安全鑒定提供資料要求
- 九月主題計劃《 嗨,你好》
- e乙二醇精制車間設(shè)備布置圖
- 縣級綜治中心等級評定細(xì)則、申報表、負(fù)面清單、流程圖
- 《中外資產(chǎn)評估準(zhǔn)則》課件第1章 資產(chǎn)評估準(zhǔn)則及其形成機(jī)理
- T∕CGMA 033001-2018 壓縮空氣站能效分級指南
- 清華大學(xué)寶玉石鑒賞標(biāo)準(zhǔn)答案
- 公司組織架構(gòu)及部門職責(zé)
評論
0/150
提交評論