——Java培训、Android培训、iOS培训、.Net培训、期待与您交流! ——-
一.概述
1.定义:反射就是把java类中的各种成分映射成相应的java类,以达到使用其功能的目的,通俗讲就是我们知某类,通过该类实例化对象来去获得该类功能方法、成员变量等,以便使用相关功能。例如一个java类中用一个Class类的对象来表示,类中的组成部分如成员变量、方法、构造方法和包等信息也用对应的java类表示。这些被表示java类通过class类提供一系列的方法来获取其中的变量、方法、构造方法、修饰符和包等信息,这些信息用相应类的实例对象来表示,如:Field,Method,Contructor,Package等。
二.class类
概述:class类是反射的基石,java程序中每个类可以视为同一类型事物,class类用于描述这些加载到内存当中字节码,把这些字节码实例化为一个对象,通过class类特有方法来去使用原Java类的一些方法、变量等。同时class类中也有booleanisPrimitive()、booleanisArray()这些类似方法,来去指定判断class类实例对象是否是基本数据类型or数组类。
举例说明class类如何初始化使用
打印结果都为ture,上面也是获取对应java类class类实例对象字节码的初始化方法。
三.Constructor类
1.概念:Constructor类接受class对象的getConstructors()方法,因而获得字节码的构造方法。
2.获取某个类中的构造方法:
2.1得到某个类的所有构造方法:Constructor[]constructor=Class.forName(类名).getConstructors()
2.2得到某个类的一个构造方法:Constructorconstructor=Class.forName(类名).getConstructor(参数类型.class)
-定义某个类的实例对象可以用Constructor类的newInstance()方法
示例:
四.Field类
1.概念:Field类代表某个类中的一个成员变量,创建的Field类对象获得的是类上面的成员变量,而不是对应到对象上面的成员变量。
2.通过将Class类中的获取某个类中的成员变量的方法创建对象
2.1-Fieldget Field(String name): 返回一个Field 对象,它反映此Class 对象所表示的类或接口的指定公共成员字段。
2.2-Field[] getFields():返回一个包含某些 Field 对象的数组,这些对象反映此 Class 对象所表示的类或接口的所有可访问公共字段。
2.3-Fieldget DeclaredField(String name):返回一个Field 对象,该对象反映此Class 对象所表示的类或接口的指定已声明字段。
2.4-Field[] getDeclaredFields():返回Field 对象的一个数组,这些对象反映此Class 对象所表示的类或接口所声明的所有字段。
3.得到某个类的成员变量:
3.1-得到某个类中的某个公有成员变量的Field类:
Field 变量名=对象名.getClass().getField(“成员变量”)
3.2-得到某个类中的某个私有成员变量的Field类:
Field 变量名=对象名.getClass().getDeclaredField(“成员变量”)
3.3Field变量名.get(类对象名),可得到某个类成员变量,访问私有成员变量,需先调用Field变量名.setAccessible(true)方法
五.Mthod类
1.概念:Method类则表示某类的某个方法。
2.Class类里获取某个类中成员方法的方法:
2.1-Method getMethod (String name,Class …parameter Type)返回一个 Method 对象,它反映此 Class 对象所表示的类或接口的指定公共成员方法。
2.2Method[] getMethod(): 返回一个包含某些 Method 对象的数组,这些对象反映此 Class 对象所表示的类或接口(包括那些由该类或接口声明的以及从超类和超接口继承的那些的类或接口)的公共member 方法。
2.3Method getDeclaredMethod(String name,Class…parameterType): 返回一个 Method 对象,该对象反映此 Class 对象所表示的类或接口的指定已声明方法。
2.4Method[] getDeclaredMethods(): 返回Method 对象的一个数组,这些对象反映此Class 对象表示的类或接口声明的所有方法,包括公共、保护、默认(包)访问和私有方法,但不包括继承的方法。
3将得到某类某方法封装成Method类格式:Method 变量名=类名.class.getMethod(“方法名”,参数类型.class)
通过调用Method类invoke()方法调用某方法:Method变量名.invoke(类对象名,方法参数列表),如果方法在类中为静态方法,则类对象名为null
六反射作用
(1)反射可以动态获得一个类的所有属性、方法等
(2)反射的主要作用就是实现框架功能。
(3)框架与工具类的区别:工具类被用户的类调用,而框架则是调用用户提供的类。
(4)在写框架时,可能用户的类还没有,所以就无法知道要调用的类名,所以在程序中就无法直接new某个类的实例对象,此时就要用反射方式来做。
举例说明反射机制: