




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、1本章任务本章任务使用反射技术获取类的结构信息使用反射技术获取类的结构信息使用反射技术使用反射技术动态创建对象动态创建对象动态修改查询属性值动态修改查询属性值动态执行方法动态执行方法动态创建数组并存取元素动态创建数组并存取元素使用静态代理实现添加日志功能使用静态代理实现添加日志功能使用动态代理实现添加日志功能使用动态代理实现添加日志功能本章目标本章目标Java反射技术反射技术反射技术的引入反射技术的引入反射技术的入口类反射技术的入口类Class反射技术的具体内容反射技术的具体内容动态创建对象动态创建对象动态修改查询属性值动态修改查询属性值动态执行方法动态执行方法动态创建数组并存取元素动态创建数
2、组并存取元素反射技术优缺点反射技术优缺点代理模式代理模式静态代理静态代理动态代理动态代理反射技术的引入反射技术的引入4-1编译和运行时都知道类和对象的具体信息,此编译和运行时都知道类和对象的具体信息,此时直接对类和对象进行操作即可,无需反射时直接对类和对象进行操作即可,无需反射public class WhyClass public void method1( Student stu1 ) Student stu2 = new Student(); = lkl;stu2.setAge(stu1.getAge();System.out.println();Sy
3、stem.out.println(stu2.getAge();传入传入Student类,而不类,而不是其他类是其他类反射技术的引入反射技术的引入4-2如果编译和运行时不知道类和对象的具体信息,如果编译和运行时不知道类和对象的具体信息,此时应该如何做呢?此时应该如何做呢?public class WhyClass public void method2( String str ) throws Exception Class clazz = Class.forName(str);Object obj = clazz.newInstance();Field fs = clazz.getFields
4、();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);使用反射技术来实现使用反射技术来实现实参:传入具体的类名实参:传入具体的类名形参:动态传入类名形参:动态传入类名反射的应用场合反射的应用场合在编译时根本无法知道该对象或类可能属于哪些类
5、,在编译时根本无法知道该对象或类可能属于哪些类,程序只依靠运行时信息来发现该对象和类的真实信程序只依靠运行时信息来发现该对象和类的真实信息息反射的作用反射的作用通过反射可以使程序代码访问装载到通过反射可以使程序代码访问装载到JVM 中的类的中的类的内部信息内部信息获取已装载类的属性信息获取已装载类的属性信息获取已装载类的方法获取已装载类的方法获取已装载类的构造方法信息获取已装载类的构造方法信息反射技术的引入反射技术的引入4-3在在JDK中,主要由以下类来实现中,主要由以下类来实现Java反射机制,反射机制,这些类都位于这些类都位于java.lang.reflect包中包中Class类:代表一个
6、类类:代表一个类Field 类:代表类的成员变量类:代表类的成员变量(属性属性)Method类:代表类的成员方法类:代表类的成员方法Constructor 类:代表类的构造方法类:代表类的构造方法Array类:提供了动态创建数组,以及访问数组的元素类:提供了动态创建数组,以及访问数组的元素的静态方法的静态方法反射技术的引入反射技术的引入4-4Class类是类是Java 反射机制的起源和入口反射机制的起源和入口用于获取与类相关的各种信息用于获取与类相关的各种信息提供了获取类信息的相关方法提供了获取类信息的相关方法Class类继承自类继承自Object类类Class类是所有类的共同的图纸类是所有类
7、的共同的图纸每个类有自己的对象,好比图纸和实物的关系每个类有自己的对象,好比图纸和实物的关系每个类也可看做是一个对象,有共同的图纸每个类也可看做是一个对象,有共同的图纸Class,存放类的存放类的结构信息,结构信息,能够通过相应方法取出相应信息能够通过相应方法取出相应信息类的名字类的名字属性属性方法方法构造方法构造方法父类和接口父类和接口反射技术的入口类反射技术的入口类Class5-1反射技术的入口类反射技术的入口类Class5-2Class类的常用方法类的常用方法文件名说 明getFields()获得类的获得类的publicpublic类型的属性。类型的属性。getDeclaredField
8、s()获得类的所有属性获得类的所有属性 getField(String name)获得类的指定属性获得类的指定属性getMethods()获得类的获得类的publicpublic类型的方法类型的方法getMethod (String name,Class args)获得类的指定方法获得类的指定方法getConstrutors()获得类的获得类的publicpublic类型的构造方法类型的构造方法getConstrutor(Class args)获得类的特定构造方法获得类的特定构造方法newInstance()通过类的无参构造方法创建该类的一个对象通过类的无参构造方法创建该类的一个对象getNa
9、me()获得类的完整名字获得类的完整名字getPackage()获取此类所属的包获取此类所属的包getSuperclass()获得此类的父类对应的获得此类的父类对应的ClassClass对象对象反射技术的入口类反射技术的入口类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);System.o
10、ut.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.out.prin
11、tln(-类的构造方法类的构造方法-);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.out.pri
12、ntln(clazz.getSuperclass();演示示例:使用演示示例:使用Class类获取类的结构信息类获取类的结构信息反射技术的入口类反射技术的入口类Class5-4为一个为一个class生成对应的生成对应的Class对象对象方 法示 例对象名对象名.getClass()String String strstr=bdqnbdqn;Class Class clazzclazz = = str.getClassstr.getClass();();对象名对象名.getSuperClass()Student Student stustu = new Student(); = new Stud
13、ent();Class c1 = Class c1 = stu.getClassstu.getClass();();Class c2 = Class c2 = stu.getSuperClassstu.getSuperClass();();Class.forName()Class Class clazzclazz = = Class.forName(java.lang.ObjectClass.forName(java.lang.Object););Class.forName(Class.forName(oracle.jdbc.driver.OracleDriveroracle.jdbc.dri
14、ver.OracleDriver ););类名类名.classClass c1 = Class c1 = String.classString.class; ;Class c2 = Class c2 = Student.classStudent.class; ;Class c2 = Class c2 = int.classint.class包装类包装类.TYPEClass c1 = Class c1 = Integer.TYPEInteger.TYPE; ;Class c2 = Class c2 = Boolean.TYPEBoolean.TYPE; ;反射技术的入口类反射技术的入口类Clas
15、s5-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;clazz =in
16、t.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对象的对应类有无参构造方法对象的对应类有无参构造方法执行执行newInstance()实际上就是执行无参构造方法来实际
17、上就是执行无参构造方法来创建该类的实例创建该类的实例使用反射动态创建对象使用反射动态创建对象2-1public class ConstructorTest public static void main(String args) throws Exception /方法方法1:调用:调用Class的的newInstance方法,仅适用于无参构造方法方法,仅适用于无参构造方法Class clazz=Class.forName(cn.jbit.reflection.Student);Object obj=clazz.newInstance();相当于执行语句:相当于执行语句: Student st
18、u = new Student();方法方法2:通过:通过Constructor的的newInstance()方法方法先使用先使用Class对象获取指定的对象获取指定的Constructor对象对象再调用再调用Constructor对象的对象的newInstance()方法来创建方法来创建该该Class对象对应类的对象对象对应类的对象通过该方法可选择使用指定构造方法来创建对象通过该方法可选择使用指定构造方法来创建对象使用反射动态创建对象使用反射动态创建对象2-2public class ConstructorTest public static void main(String args) t
19、hrows Exception / 方法方法2:调用:调用Constructor的的newInstance方法,适用所有构造方法方法,适用所有构造方法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.println(obj)
20、; /也可以调用无参构造方法,只是比方法也可以调用无参构造方法,只是比方法1复杂复杂obj=clazz.getConstructor(new Class).newInstance(new Object);obj=clazz.getConstructor().newInstance();System.out.println(obj);演示示例:使用反射动态创建对象演示示例:使用反射动态创建对象相当于执行语句:相当于执行语句: Student stu=new Student(lkl,32,56.5f);相当于执行语句:相当于执行语句: Student stu=new Student();练习练习C
21、lass类和类和Constructor类类需求说明:需求说明:使用多种方法生成一个使用多种方法生成一个Student类的类的Class对象对象使用使用Class类获取类获取String和和Student类的结构信类的结构信息并输出息并输出使用反射技术动态创建使用反射技术动态创建Student类的对象类的对象通过无参构造方法通过无参构造方法通过有参构造方法通过有参构造方法实现步骤实现步骤参考本专题实现步骤和代码参考本专题实现步骤和代码完成时间:完成时间:25分钟分钟共性问题集中讲解共性问题集中讲解n常见调试问题及解决办法常见调试问题及解决办法n代码规范问题代码规范问题共性问题集中讲解共性问题集中
22、讲解通过通过Class对象的对象的getFields()或者或者getField()方法可以获方法可以获得该类所包括的全部得该类所包括的全部Field属性或指定属性或指定Field属性。属性。Field类提供了以下方法来访问属性类提供了以下方法来访问属性getXxx(Object obj):获取:获取obj对象该对象该Field的属性值。此处的的属性值。此处的Xxx对应对应8个基本数据类型,如果该属性类型是引用类型则直接个基本数据类型,如果该属性类型是引用类型则直接使用使用get(Object obj)setXxx(Object obj,Xxx val):将:将obj对象的该对象的该Field
23、赋值赋值val。此处的此处的Xxx对应对应8个基本数据类型,如果该属性类型是引用类型个基本数据类型,如果该属性类型是引用类型则直接使用则直接使用set(Object obj, Object val)setAccessible(Boolean flag):若:若flag为为true,则取消属性的,则取消属性的访问权限控制,即使访问权限控制,即使private属性也可以进行访问属性也可以进行访问使用反射动态修改查询属性值使用反射动态修改查询属性值2-1使用反射动态修改查询属性值使用反射动态修改查询属性值2-2public class FieldTest public static void mai
24、n(String args) throws Exception Class clazz = Class.forName(cn.jbit.reflection.Student);Object obj = clazz.newInstance();/ 调用调用getDeclaredField(name) 取得取得name属性对应的属性对应的Field对象对象Field f = clazz.getDeclaredField(name);/ 取消属性的访问权限控制,即使取消属性的访问权限控制,即使private属性也可以进行访问。属性也可以进行访问。f.setAccessible(true);/ 调用调
25、用get()方法取得对应属性值。方法取得对应属性值。System.out.println(f.get(obj); /相当于相当于obj.getName();/ 调用调用set()方法给对应属性赋值。方法给对应属性赋值。f.set(obj, lkl); /相当于相当于obj.setName(lkl); / 调用调用get()方法取得对应属性修改后的值。方法取得对应属性修改后的值。System.out.println(f.get(obj);演示示例:使用反射动态修改和查询属性值演示示例:使用反射动态修改和查询属性值通过通过Class对象的对象的getMethods() 方法可以获得方法可以获得该类
26、所包括的全部方法该类所包括的全部方法, 返回值是返回值是Method通过通过Class对象的对象的getMethod()方法可以获得该方法可以获得该类所包括的指定方法类所包括的指定方法, 返回值是返回值是Method每个每个Method对象对应一个方法,获得对象对应一个方法,获得Method对象后,可以调用其对象后,可以调用其invoke() 来调用对应方法来调用对应方法Object invoke(Object obj,Object args):obj代表代表当前方法所属的对象的名字,当前方法所属的对象的名字,args代表当前方法的代表当前方法的参数列表,返回值参数列表,返回值Object是当
27、前方法的返回值,即是当前方法的返回值,即执行当前方法的结果。执行当前方法的结果。使用反射动态执行方法使用反射动态执行方法2-1使用反射动态执行方法使用反射动态执行方法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 / 创建该类的一个对象创建该类的一个对象Class c
28、lazz = TestMethod.class;Object obj = clazz.newInstance();/ 调用该对象的调用该对象的add方法方法Method amethod=clazz.getMethod(add,new Classint.class, int.class);Object result = amethod.invoke(obj, new Object 5, 7 );System.out.println(result);/ 调用该对象的调用该对象的shout方法方法Method smethod=clazz.getMethod(shout,new ClassString
29、.class);smethod.invoke(obj, new Object lkl );演示示例:使用反射动态执行方法演示示例:使用反射动态执行方法相当于执行语句:相当于执行语句:TestMethod tm=new TestMethod();int sum=tm.add(5, 7);System.out.println(sum);tm.shout(lkl);练习练习Field类和类和Method类类需求说明:需求说明:使用反射修改和查询使用反射修改和查询Student类的类的name属性属性使用反射动态执行使用反射动态执行TestMethod类的类的add方法和方法和shout方法方法实现步
30、骤实现步骤参考本专题实现步骤和代码参考本专题实现步骤和代码完成时间:完成时间:20分钟分钟共性问题集中讲解共性问题集中讲解n常见调试问题及解决办法常见调试问题及解决办法n代码规范问题代码规范问题共性问题集中讲解共性问题集中讲解在在java.lang.reflect包下提供了包下提供了Array类,包括类,包括一系列一系列static方法,通过这些方法可动态的创建方法,通过这些方法可动态的创建数组、给元素赋值、取出元素值等数组、给元素赋值、取出元素值等Array提供的主要方法如下:提供的主要方法如下:static Object newInstance(Class componentType, i
31、nt dim) :创建一个具有指定的:创建一个具有指定的组件类型和维度的新数组组件类型和维度的新数组static void setXxx(Object array, int index ,xxx val):给数组对象:给数组对象array中第中第index个元素赋值个元素赋值valstatic xxx getXxx(Object array, int index):以:以 xxx形式返回指定数组对象形式返回指定数组对象array中第中第index个元素值个元素值使用反射动态创建数组并存取元素使用反射动态创建数组并存取元素3-1使用反射动态创建数组并存取元素使用反射动态创建数组并存取元素3-2p
32、ublic class ArrayTest1 public static void main(String args) throws Exception / 创建一个含有创建一个含有10个元素的整型数组个元素的整型数组Class clazz = Class.forName(java.lang.Integer);Object arr = Array.newInstance(clazz, 10);/ Object arr=Array.newInstance(Integer.TYPE, 10);/ 给第五个元素赋值给第五个元素赋值Array.set(arr, 5, 20);/ Array.setIn
33、t(arr, 5, 20);/ 取出第五个元素值并输出取出第五个元素值并输出Object elem = Array.get(arr, 5);System.out.println(elem);演示示例:使用反射动态创建一维数组并存取元素演示示例:使用反射动态创建一维数组并存取元素相当于执行语句:相当于执行语句: int arr=new int10; arr5=20; System.out.println(arr5);使用反射动态创建数组并存取元素使用反射动态创建数组并存取元素3-3public class ArrayTest2 public static void main(String arg
34、s) throws Exception / 创建一个含有创建一个含有10*15*18个元素的整型数组个元素的整型数组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);System.ou
35、t.println(elem);演示示例:使用反射动态创建多维数组并存取元素演示示例:使用反射动态创建多维数组并存取元素相当于执行语句:相当于执行语句: int arr =new int101518; arr5810=20; System.out.println(arr5810);练习练习Array类类需求说明:需求说明:使用反射动态创建一维整型数组并存取元素使用反射动态创建一维整型数组并存取元素使用反射动态创建多维整型数组并存取元素使用反射动态创建多维整型数组并存取元素实现步骤实现步骤参考本专题实现步骤和代码参考本专题实现步骤和代码完成时间:完成时间:20分钟分钟共性问题集中讲解共性问题集中
36、讲解n常见调试问题及解决办法常见调试问题及解决办法n代码规范问题代码规范问题共性问题集中讲解共性问题集中讲解反射提高了反射提高了Java程序的灵活性和扩展性,降低耦程序的灵活性和扩展性,降低耦合性,提高自适应能力。它允许程序创建和控制合性,提高自适应能力。它允许程序创建和控制任何类的对象,无需提前硬编码目标类任何类的对象,无需提前硬编码目标类反射是其它一些常用语言,如反射是其它一些常用语言,如C、C+、Fortran 或者或者Pascal等都不具备的等都不具备的Java反射技术应用领域很广,如软件测试、反射技术应用领域很广,如软件测试、 EJB、JavaBean等等许多流行的开源框架例如许多流
37、行的开源框架例如Struts、Hibernate、Spring在实现过程中都采用了该技术在实现过程中都采用了该技术反射技术优缺点反射技术优缺点2-1反射的缺点反射的缺点性能问题性能问题使用反射基本上是一种解释操作,用于字段和方法接入时使用反射基本上是一种解释操作,用于字段和方法接入时要远慢于直接代码。因此要远慢于直接代码。因此Java反射机制主要应用在对灵活反射机制主要应用在对灵活性和扩展性要求很高的系统框架上性和扩展性要求很高的系统框架上,普通程序不建议使用。普通程序不建议使用。使用反射会模糊程序内部逻辑使用反射会模糊程序内部逻辑程序人员希望在源代码中看到程序的逻辑,反射等绕过了程序人员希望
38、在源代码中看到程序的逻辑,反射等绕过了源代码的技术,因而会带来维护问题。反射代码比相应的源代码的技术,因而会带来维护问题。反射代码比相应的直接代码更复杂。直接代码更复杂。反射技术优缺点反射技术优缺点2-2小结小结Java反射技术的主要实现类有哪些,其作用分别反射技术的主要实现类有哪些,其作用分别是什么?是什么?生成一个生成一个Class对象的方法主要有哪些?对象的方法主要有哪些?getFields()和和getDeclaredFields()有什么区别?有什么区别?反射技术的优缺点有哪些?反射技术的优缺点有哪些?代理模式简介代理模式简介2-1代理模式是代理模式是23中设计模式之一中设计模式之一
39、代理模式的作用代理模式的作用为其他对象提供一种代理以控制对目标对象的访问。为其他对象提供一种代理以控制对目标对象的访问。某些情况下客户不想或不能直接引用另一个对象,而某些情况下客户不想或不能直接引用另一个对象,而代理对象可在客户端和目标对象间起到中介作用代理对象可在客户端和目标对象间起到中介作用代理模式的分类代理模式的分类静态代理静态代理动态代理动态代理代理模式简介代理模式简介2-2代理模式一般涉及到的角色代理模式一般涉及到的角色抽象角色:真实对象和代理对象的共同接口抽象角色:真实对象和代理对象的共同接口真实角色:真实对象,最终要引用的对象真实角色:真实对象,最终要引用的对象代理角色代理角色内
40、部含有对真实对象的引用,从而可以操作真实对象内部含有对真实对象的引用,从而可以操作真实对象提供与真实对象相同的接口以便在任何时刻代替真实对象提供与真实对象相同的接口以便在任何时刻代替真实对象可在执行真实对象操作前后附加其他操作,相当于对真实对可在执行真实对象操作前后附加其他操作,相当于对真实对象进行封装象进行封装InterfaceSubject+ operation1+ operation2-Subject subjectProxy+ operation1+ operation2RealSubject+ operation1+ operation2静态代理静态代理5-1抽象角色抽象角色/* *
41、 学生管理接口学生管理接口 * author 北大青鸟北大青鸟 * */public interface StuManager /* * 按照指定按照指定id删除学生删除学生 * param id */public void deleteStu(int id);/* * 查询指定查询指定id的学生的学生 * param id * return */public String selectStu(int id);静态代理静态代理5-2真实角色真实角色/* * 学生管理实现类学生管理实现类 * author 北大青鸟北大青鸟 */public class StuManagerImpl implem
42、ents StuManager public void deleteStu(int id) System.out.println(deleteStu);public String selectStu(int id) System.out.println(selectStu);return lkl;静态代理静态代理5-3代理角色代理角色/ 学生管理静态代理类学生管理静态代理类, 在进行操作前记录操作日志在进行操作前记录操作日志 public class StuManagerSproxy implements StuManager StuManager stumanager;public StuM
43、anagerSproxy() 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、作之前添加日志删除操作之前添加日志查询操作之前添加日志查询操作之前添加日志记录操作日志记录操作日志静态代理静态代理5-4测试类测试类public class Test public static void main(String args) System.out.println(-不使用静态代理进行操作不使用静态代理进行操作-);/创建目标类对象,不使用静态代理创建目标类对象,不使用静态代理StuManager sm1=new StuManagerImpl();/删除指定删除指定id学生学生sm1.deleteStu(5);/查询指定查询指定id学生信息学生信息System.out.print
45、ln(sm1.selectStu(5);System.out.println(-使用静态代理进行操作使用静态代理进行操作-);/创建静态代理类对象创建静态代理类对象StuManager sm2=new StuManagerSproxy();/删除指定删除指定id学生学生sm2.deleteStu(5);/查询指定查询指定id学生信息学生信息System.out.println(sm2.selectStu(5);演示示例:使用静态代理实现添加日志功能演示示例:使用静态代理实现添加日志功能静态代理静态代理5-5优点优点不需要修改目标对象就实现了功能的增加不需要修改目标对象就实现了功能的增加缺点缺点
46、真实角色必须是事先已经存在的,并将其作为代理真实角色必须是事先已经存在的,并将其作为代理对象的内部属性。如果事先并不知道真实角色则无对象的内部属性。如果事先并不知道真实角色则无法使用法使用一个真实角色必须对应一个代理角色,如果大量使一个真实角色必须对应一个代理角色,如果大量使用会导致类的急剧膨胀用会导致类的急剧膨胀如果事先并不知道真实角色,该如何使用代理呢?如果事先并不知道真实角色,该如何使用代理呢?动态代理动态代理动态代理动态代理6-1Java动态代理类位于动态代理类位于java.lang.reflect包下,包下,主要涉及到以下两个类主要涉及到以下两个类InvocationHandler接
47、口接口Proxy类类InvocationHandler接口仅定义了一个方法接口仅定义了一个方法public object invoke(Object obj,Method method, Object args)obj一般是指代理类一般是指代理类method是被代理的方法是被代理的方法args为该方法的参数数组为该方法的参数数组 这个抽象方法在代理类中动态实现这个抽象方法在代理类中动态实现动态代理动态代理6-2Proxy类即为动态代理类,主要方法包括类即为动态代理类,主要方法包括protected Proxy(InvocationHandler h) 构造函数,用于给内部的构造函数,用于给内部
48、的h赋值赋值static Object newProxyInstance(ClassLoader loader, Class interfaces, InvocationHandler h) 返回代理类的一个实例返回代理类的一个实例loader是类装载器是类装载器interfaces是真实类所拥有的全部接口的数组是真实类所拥有的全部接口的数组static Class getProxyClass (ClassLoader loader, Class interfaces) 获得一个代理类获得一个代理类动态代理动态代理6-3抽象角色和真实角色抽象角色和真实角色为方便起见,采用了和静态代理相同的类为
49、方便起见,采用了和静态代理相同的类但必须明确一个动态代理类可适用多个抽象角色和但必须明确一个动态代理类可适用多个抽象角色和真实角色真实角色/* * 学生管理接口学生管理接口 * author 北大青鸟北大青鸟 * */public interface StuManager /* * 按照指定按照指定id删除学生删除学生 * param id */public void deleteStu(int id);/* * 查询指定查询指定id的学生的学生 * param id * return */public String selectStu(int id);/* * 学生管理实现类学生管理实现类
50、* 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;动态代理动态代理6-4定义定义LogHandler包含对真实对象的引用包含对真实对象的引用实现实现InvocationHandler 接口接口返回动态代理对象返回动态代理对象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. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 草原生态补偿机制考核试卷
- 电机在循环经济模式中的应用考核试卷
- 电容器在空调与制冷设备中的效率提升考核试卷
- 蛋品营销策略与消费者行为研究考核试卷
- 服饰企业的创新与生产考核试卷
- 搪瓷卫生洁具的市场调研与消费者行为考核试卷
- 计算机组装与硬件维护考核试卷
- 聚苯乙烯湿法纺丝考核试卷
- 窄轨机车车辆设计与制造标准符合性考核试卷
- 租赁农机的节能减排考核试卷
- 护理不良事件根本原因RCA分析-中医热奄包治疗烫伤
- 人教版九年级数学上册一元二次方程《一元二次方程整 理与复习》示范公开课教学课件
- 平安证券公司融资融券业务方案设计
- 2024秋期国家开放大学专科《液压与气压传动》一平台在线形考(形考任务+实验报告)试题答案
- 推拿店合同范例
- 宁德时代推出“宁家服务”
- 消防安全重点工种人员情况
- 急救包扎课件
- 广告策划方案-今麦郎方便面广告策划书
- 2024年高考真题-物理(贵州卷) 含解析
- 金融领域大语言模型应用安全探析
评论
0/150
提交评论