第8章Java的反射机制.ppt
《第8章Java的反射机制.ppt》由会员分享,可在线阅读,更多相关《第8章Java的反射机制.ppt(38页珍藏版)》请在课桌文档上搜索。
1、Java的反射机制,主要内容,1.Class的基本概念以及创建方式2.反射的基本概念3.类的各个组成部分对应的反射类 Constructor Field Method4.反射在框架中的应用,反射的基础-Class,Java当中的类用来表示具有相同属性和方法的对象的结合,是抽象的概念。对象是类创建的,同一个类的不同对象具有不同的属性值。Java当中定义的所有类都属于同一类事物,可以用Class来表示。对比理解:不同的人可以用Person类来表示。人-Person Java当中定义的不同类可以用Class来表示。Java当中的类-Class,Class类的对象-字节码,Class类的对象就是不同的
2、类对应的字节码。获取Class的对象Person p1=new Person();Class class1=new Class()()三种方式:(1)对象名.getClass()Person p1=new Person();p1.getClass();(2)类名.class Date.class(3)Class.forName()方法(此方式用的较多)Class.forName(“java.lang.String”);,基本数据类型的Class对象,Java当中的基本数据类型有:boolean int short byte char long float 和 double 它们也有各自的Cla
3、ss对象。例如:int.class void 也有自己对应的Class对象 void.class 基本数据类型对应的封装类有属性TYPE,这个属性代表了封装类所封装的基本数据类型的Class对象。int.class=Integer.TYPE void.class=Void.TYPE,反射(Reflect),反射就是把Java类中的各个组成部分映射成相应的Java类。一个类的组成部分包括:属性、方法、构造方法、包等。这些组成部分都会被映射成相应的类。Class类定义了一系列方法来获取java类的属性、方法、构造方法、包等信息,这些信息都有相应的类来表示,分别是Field、Method、Const
4、ructor、Package等。注意:表示java类组成部分的各种类位于java.lang.reflect包中。,Constructor类,Constructor类用来描述类中所定义的构造方法。(1)得到类的所有构造方法 Constructor constructors=Class.forName(“java.lang.String”).getConstructors();(2)得到类中某个具体的构造方法,在getConstructor中传入参数类型所对应的字节码 Constructor constructor=Class.forName(“java.lang.String”).getCons
5、tructor(String.class)使用Constructor类的目的是用来创建相应类的对象 正常情况 String str=new String(“hello”);反射情况 Constructor con=String.class.getConstructor(String.class)String str=(String)con.newInstance(“hello”);,Class.newInstance(),通过反射方式创建对象的过程 Class-Constructor-某个类的对象只有当要用某个类的无参构造方法创建该类对象时,可以省略创建Constructor类对象的这个过程。
6、Date d=(Date)Class.forName(“java.util.Date”).newInstance();注意:java运行环境的缓存中保存了类的无参构造方法所对应的Construtor对象。见源文件:ReflectTest.java,Field类,Field类用来表示类中的属性(字段)。(1)Class.getFields():得到Class对象的所有字段,返回的是Field数组。(2)Class.getField(String name)返回一个 Field 对象,它反映此 Class 对象所表示的类或接口的指定公有成员字段。(3)Field的对象所代表的某一个类的属性,而不是
7、那个类的某一个对象的属性。要得到某个对象对应的属性值,需要通过get(Object obj)方法与某个对象具体关联。(4)对于非公有属性只能通过Class的getDeclaredField(String fieldName)方法得到。(5)对于私有属性要得到它所关联到的对象的值,需通过Field的setAccessible(boolean boolean)方法设置。(6)Field类的getType()方法用来得到字段所属的类型 见源文件:Field/FieldTest.java,Field类,练习:扫描一个对象中所有的字符串类型的属性,并为每一个字符串属性的值后面添加“hello”字符串,然
8、后将这个对象输出。见源文件:Field/FieldTest1.java 注意:对于字节码的比较一定要用“=”,而不是equals()。掌握上述例子对于理解Spring等框架技术具有重要作用。,Method类,Method用来表示类中的方法。通过Class对象的如下方法得到Method对象Method getMethod(String name,Class.parameterTypes)按名称得到某个特定的public方法(包括从父类或接口继承的方法)Method getMethods()得到public方法(包括从父类或接口继承的方法)Method getDeclaredMethods()得到
9、所有的方法(不包括继承的方法)Method getDeclaredMethod(String name,Class.parameterTypes)按名称得到某个特定的方法(不包括继承的方法),Method类,Class的getMethod()方法得到Method类的对象。(1)需要传递方法名所对应的字符串(2)需要传递该方法所需要的参数类型的字节码 invoke(Object obj,Object obj)方法用来调用Method所表示的方法。其中,第一个参数表示此方法作用于哪一个对象。见源文件:Method/MethodTest.java 注意:如果调用的是个静态方法,那么invoke()方
10、法中第一个参数用null表示。,对接收数组参数的方法进行反射,问题:编写一个程序,这个程序能够接收用户提供的类名,然后去执行这个类中的main()方法。见源文件:method/MethodTest1.java注意:JDK1.4的编译器会把数组中的每一个元素作为一个参数,来调用此接收数组参数的方法,这样的话就出现了参数不对应的问题。mainMethod.invoke(null,new Stringaaa,bbb,ccc);JDK1.5为了兼容1.4,就必须将整个数组作为一个只有一个元素的Object数组进行传递。以下两种方式正确:(1)mainMethod.invoke(null,new Obj
11、ectnew Stringaaa,bbb,ccc);(2)mainMethod.invoke(null,(Object)new Stringaaa,bbb,ccc);,数组的反射,在Java中数组属于复合数据类型,具有相同元素类型和维数的数组属于同一个类型,即具有相同的字节码对象。代表数组的字节码对象调用getSuperClass()得到它的父类Object的字节码对象。基本数据类型的一维数组可以当做Object类型使用,但不能当做Object类型使用;基本数据类型的二维数组可以当做Object类型使用;复合数据类型的一维数组既可以当做Object类型使用,也可以当做Object类型使用。ja
12、va.lang.reflect.Array用于完成对数组的反射操作。见源文件:数组的反射/ArrayReflect.java,反射的作用-实现框架,框架:是一个半成品的软件,需要开发人员进行填充相关内容,才能形成用户使用的软件产品。开发商提供的房子就是一个框架,需要把“空”房子买来以后,需要按照自己的意愿进行装修,然后就有了自己的家。,反射的作用-实现框架,框架和工具类的区别:面向对象的本质就是类与类之间的相互调用。你调用别人的类,那么别人写的类就是工具类;别人写的类来调用你的类,那么别人的类就是框架。反射要实现的核心功能:无法知道将来要调用的类名,所以就不能使用new来创建一个对象,因此必须
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Java 反射 机制
链接地址:https://www.desk33.com/p-751267.html