java反射与代理.ppt
《java反射与代理.ppt》由会员分享,可在线阅读,更多相关《java反射与代理.ppt(48页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、反射与代理反射与代理第一章第一章第一章第一章本章任务本章任务使用反射技术获取类的结构信息使用反射技术获取类的结构信息使用反射技术使用反射技术动态创建对象动态创建对象动态修改查询属性值动态修改查询属性值动态执行方法动态执行方法动态创建数组并存取元素动态创建数组并存取元素使用静态代理实现添加日志功能使用静态代理实现添加日志功能使用动态代理实现添加日志功能使用动态代理实现添加日志功能本章目标本章目标Java反射技术反射技术反射技术的引入反射技术的引入反射技术的入口类反射技术的入口类Class反射技术的具体内容反射技术的具体内容动态创建对象动态创建对象动态修改查询属性值动态修改查询属性值动态执行方法动
2、态执行方法动态创建数组并存取元素动态创建数组并存取元素反射技术优缺点反射技术优缺点代理模式代理模式静态代理静态代理动态代理动态代理反射技术的引入反射技术的引入4-1编译和运行时都知道类和对象的具体信息,此编译和运行时都知道类和对象的具体信息,此时直接对类和对象进行操作即可,无需反射时直接对类和对象进行操作即可,无需反射public class WhyClass public void method1(Student stu1)Student stu2=new Student();stu2.name=lkl;stu2.setAge(stu1.getAge();System.out.println
3、(stu2.name);System.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.getF
4、ields();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()通过类的无参构造方法创建该类的一个对象通过类的无参构造方法创建该类的一个对象getNam
9、e()获得类的完整名字获得类的完整名字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.out.prin
10、tln(-类的字段类的字段-);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.println(-类的构造方法类的构造方法-);
11、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.println(clazz.getSuperclass(
12、);演示示例:使用演示示例:使用Class类获取类的结构信息类获取类的结构信息反射技术的入口类反射技术的入口类Class5-4为一个为一个class生成对应的生成对应的Class对象对象方 法示 例对象名对象名.getClass()String String strstr=bdqnbdqn;Class Class clazzclazz=str.getClassstr.getClass();();对象名对象名.getSuperClass()Student Student stustu=new Student();=new Student();Class c1=Class c1=stu.getCl
13、assstu.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.driver.OracleDriver););类名类名.classClass c1=Class
14、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;反射技术的入口类反射技术的入口类Class5-5public class TestClass2 public static void main(String args)throws Cla
15、ssNotFoundException/方法方法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=int.class;/方法方法3:Class.forName()clazz=Class.forName(java.lang.String);clazz=Clas
16、s.forName(java.util.Date);/方法方法4:包装类:包装类.TYPEclazz=Integer.TYPE;clazz=Void.TYPE;演示示例:生成一个类的演示示例:生成一个类的Class对象对象方法方法1:通过:通过Class的的newInstance()方法方法该方法要求该该方法要求该Class对象的对应类有无参构造方法对象的对应类有无参构造方法执执行行newInstance()实实际际上上就就是是执执行行无无参参构构造造方方法法来来创建该类的实例创建该类的实例使用反射动态创建对象使用反射动态创建对象2-1public class ConstructorTest
17、public static void main(String args)throws Exception/方法方法1:调用:调用Class的的newInstance方法,仅适用于无参构造方法方法,仅适用于无参构造方法Class clazz=Class.forName(cn.jbit.reflection.Student);Object obj=clazz.newInstance();相当于执行语句:相当于执行语句:Student stu=new Student();方法方法2:通过:通过Constructor的的newInstance()方法方法先使用先使用Class对象获取指定的对象获取指定
18、的Constructor对象对象再再调调用用Constructor对对象象的的newInstance()方方法法来来创创建建该该Class对象对应类的对象对象对应类的对象通过该方法可选择使用指定构造方法来创建对象通过该方法可选择使用指定构造方法来创建对象使用反射动态创建对象使用反射动态创建对象2-2public class ConstructorTest public static void main(String args)throws Exception/方法方法2:调用:调用Constructor的的newInstance方法,适用所有构造方法方法,适用所有构造方法Class clazz
19、=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);/也可以调用无参构造方法,只是比方法也可以调用无参构造方法,只是比方法1复杂复杂obj=clazz.getConstructor(new Class).newInstance(new Obje
20、ct);obj=clazz.getConstructor().newInstance();System.out.println(obj);演示示例:使用反射动态创建对象演示示例:使用反射动态创建对象相当于执行语句:相当于执行语句:Student stu=new Student(lkl,32,56.5f);相当于执行语句:相当于执行语句:Student stu=new Student();练习练习Class类和类和Constructor类类需求说明:需求说明:使用多种方法生成一个使用多种方法生成一个Student类的类的Class对象对象使用使用Class类获取类获取String和和Studen
21、t类的结构信类的结构信息并输出息并输出使用反射技术动态创建使用反射技术动态创建Student类的对象类的对象通过无参构造方法通过无参构造方法通过有参构造方法通过有参构造方法实现步骤实现步骤参考本专题实现步骤和代码参考本专题实现步骤和代码完成时间:完成时间:25分钟分钟共性问题集中讲解共性问题集中讲解n常见调试问题及解决办法常见调试问题及解决办法n代码规范问题代码规范问题共性问题集中讲解共性问题集中讲解通过通过Class对象的对象的getFields()或者或者getField()方法可以获方法可以获得该类所包括的全部得该类所包括的全部Field属性或指定属性或指定Field属性。属性。Fiel
22、d类提供了以下方法来访问属性类提供了以下方法来访问属性getXxx(Object obj):获取:获取obj对象该对象该Field的属性值。此处的的属性值。此处的Xxx对应对应8个基本数据类型,如果该属性类型是引用类型则直接个基本数据类型,如果该属性类型是引用类型则直接使用使用get(Object obj)setXxx(Object obj,Xxx val):将:将obj对象的该对象的该Field赋值赋值val。此处的此处的Xxx对应对应8个基本数据类型,如果该属性类型是引用类型个基本数据类型,如果该属性类型是引用类型则直接使用则直接使用set(Object obj,Object val)se
23、tAccessible(Boolean flag):若:若flag为为true,则取消属性的,则取消属性的访问权限控制,即使访问权限控制,即使private属性也可以进行访问属性也可以进行访问使用反射动态修改查询属性值使用反射动态修改查询属性值2-1使用反射动态修改查询属性值使用反射动态修改查询属性值2-2public class FieldTest public static void main(String args)throws Exception Class clazz=Class.forName(cn.jbit.reflection.Student);Object obj=clazz
24、.newInstance();/调用调用getDeclaredField(name)取得取得name属性对应的属性对应的Field对象对象Field f=clazz.getDeclaredField(name);/取消属性的访问权限控制,即使取消属性的访问权限控制,即使private属性也可以进行访问。属性也可以进行访问。f.setAccessible(true);/调用调用get()方法取得对应属性值。方法取得对应属性值。System.out.println(f.get(obj);/相当于相当于obj.getName();/调用调用set()方法给对应属性赋值。方法给对应属性赋值。f.set
25、(obj,lkl);/相当于相当于obj.setName(lkl);/调用调用get()方法取得对应属性修改后的值。方法取得对应属性修改后的值。System.out.println(f.get(obj);演示示例:使用反射动态修改和查询属性值演示示例:使用反射动态修改和查询属性值通过通过Class对象的对象的getMethods()方法可以获得方法可以获得该类所包括的全部方法该类所包括的全部方法,返回值是返回值是Method通过通过Class对象的对象的getMethod()方法可以获得该方法可以获得该类所包括的指定方法类所包括的指定方法,返回值是返回值是Method每个每个Method对象对
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- java 反射 代理
限制150内