欢迎来到天天文库
浏览记录
ID:45326076
大小:1.18 MB
页数:48页
时间:2019-11-11
《java反射与代理》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、反射与代理第一章本章任务使用反射技术获取类的结构信息使用反射技术动态创建对象动态修改查询属性值动态执行方法动态创建数组并存取元素使用静态代理实现添加日志功能使用动态代理实现添加日志功能本章目标Java反射技术反射技术的引入反射技术的入口类Class反射技术的具体内容动态创建对象动态修改查询属性值动态执行方法动态创建数组并存取元素反射技术优缺点代理模式静态代理动态代理反射技术的引入4-1编译和运行时都知道类和对象的具体信息,此时直接对类和对象进行操作即可,无需反射publicclassWhyClass{publicvoidmet
2、hod1(Studentstu1){Studentstu2=newStudent();stu2.name="lkl";stu2.setAge(stu1.getAge());System.out.println(stu2.name);System.out.println(stu2.getAge());}}传入Student类,而不是其他类反射技术的引入4-2如果编译和运行时不知道类和对象的具体信息,此时应该如何做呢?publicclassWhyClass{publicvoidmethod2(Stringstr)throwsExc
3、eption{Classclazz=Class.forName(str);Objectobj=clazz.newInstance();Field[]fs=clazz.getFields();Method[]ms=clazz.getMethods();}publicstaticvoidmain(String[]args)throwsException{WhyClasst=newWhyClass();t.method2("java.lang.String");t.method2("cn.jbit.reflection.Studen
4、t");t.method2("java.util.Date");}}使用反射技术来实现实参:传入具体的类名形参:动态传入类名反射的应用场合在编译时根本无法知道该对象或类可能属于哪些类,程序只依靠运行时信息来发现该对象和类的真实信息反射的作用通过反射可以使程序代码访问装载到JVM中的类的内部信息获取已装载类的属性信息获取已装载类的方法获取已装载类的构造方法信息反射技术的引入4-3在JDK中,主要由以下类来实现Java反射机制,这些类都位于java.lang.reflect包中Class类:代表一个类Field类:代表类的成员变量
5、(属性)Method类:代表类的成员方法Constructor类:代表类的构造方法Array类:提供了动态创建数组,以及访问数组的元素的静态方法反射技术的引入4-4Class类是Java反射机制的起源和入口用于获取与类相关的各种信息提供了获取类信息的相关方法Class类继承自Object类Class类是所有类的共同的图纸每个类有自己的对象,好比图纸和实物的关系每个类也可看做是一个对象,有共同的图纸Class,存放类的结构信息,能够通过相应方法取出相应信息类的名字属性方法构造方法父类和接口反射技术的入口类Class5-1反射技术
6、的入口类Class5-2Class类的常用方法文件名说明getFields()获得类的public类型的属性。getDeclaredFields()获得类的所有属性getField(Stringname)获得类的指定属性getMethods()获得类的public类型的方法getMethod(Stringname,Class[]args)获得类的指定方法getConstrutors()获得类的public类型的构造方法getConstrutor(Class[]args)获得类的特定构造方法newInstance()通过类的无参
7、构造方法创建该类的一个对象getName()获得类的完整名字getPackage()获取此类所属的包getSuperclass()获得此类的父类对应的Class对象反射技术的入口类Class5-3publicclassTestClass{publicstaticvoidmain(String[]args)throwsException{Classclazz=Class.forName("java.lang.Object");//Classclazz=Class.forName("java.lang.String");Syste
8、m.out.println("------类的字段------------");Fieldfields[]=clazz.getDeclaredFields();for(Fieldfield:fields)System.out.println(field.getName()+"
此文档下载收益归作者所有