API:
内容:
- 反射基础+反射基本流程
- 反射可访问的常用信息
- 通过反射访问的构造方法的使用
- 通过反射访问的方法的使用
- 通过反射访问的方法的使用
- 无耻的反射小demo
注:2.3.4.5 都是一些方法的例举,归纳,可跳过。
1.反射基础
Java 反射机制主要提供了以下功能,这些功能都位于java.lang.reflect
包。
- 在
运行时
判断任意一个对象所属的类。 - 在
运行时
构造任意一个类的对象。 - 在
运行时
判断任意一个类所具有的成员变量和方法。 - 在
运行时
调用任意一个对象的方法。 - 生成
动态代理
。 - 可以获取对象的私有属性、调用对象的私有方法
反射使用基本步骤:
- 获取类对应的Class对象
- 使用Class对象获取指定构造方法对象
Constructor
、方法对象Method
、成员对象Filed
- 使用
Constructor
、Method
、Filed
的实例对象构造类的对象、调用类的方法、访问/修改类的属性
- 获取类的Class对象:
- Class.forName(ClassName)
- 类名.class
- 对象.getCalss()
-
Constructor
、Method
、Field
的获取:
- getXXXs():获取此Class对象表示的公有XXX组成的数组
- getXXX(...):根据参数获取此Class对象表示的公有XXX
- getDeclareXXXs():获取此Class对象表示的所有XXX组成的数组
- getDeclareXXX(...):获取此Class对象表示的所有XXX
其中:XXX表示Constructor
、Method
、Field
;如果是获取(构造)方法,则参数为(构造)方法参数类型的Class对象,如果是成员变量,则参数就是成员变量名。
-
Constructor
、Method
、Field
的使用(这里只是一个常用的使用举例,还有很多使用见下表)
- constructor .newInstance(...):构造一个此Class对象的实例
- method.invoke(Object obj , Object...args):调用obj对象的method方法,传入参数 args(可以为空)
- field.get(Object obj)/set(Object obj, Object value):获取obj对象的filed值或设置obj对象的filed值为value
2. 反射可访问的常用信息
类型 | 访问方法 | 返回值类型 | 说明 |
---|---|---|---|
包路径 | getPackage() | Package 对象 | 获取该类的存放路径 |
类名称 | getName() | String 对象 | 获取该类的名称 |
继承类 | getSuperclass() | Class 对象 | 获取该类继承的类 |
实现接口 | getlnterfaces() | Class 型数组 | 获取该类实现的所有接口 |
构造方法 | getConstructors() |
Constructor 型数组 | 获取所有权限为 public 的构造方法 |
构造方法 | getDeclaredContxuectors() |
Constructor 对象 | 获取当前对象的所有构造方法 |
方法 | getMethods() |
Methods 型数组 | 获取所有权限为 public 的方法 |
方法 | getDeclaredMethods() |
Methods 对象 | 获取当前对象的所有方法 |
成员变量 | getFields() |
Field 型数组 | 获取所有权限为 public 的成员变量 |
成员变量 | getDeclareFileds() |
Field 对象 | 获取当前对象的所有成员变量 |
内部类 | getClasses() | Class 型数组 | 获取所有权限为 public 的内部类 |
内部类 | getDeclaredClasses() | Class 型数组 | 获取所有内部类 |
内部类的声明类 | getDeclaringClass() | Class 对象 | 如果该类为内部类,则返回它的成员类,否则返回 null |
如上表所示,在调用 getFields() 和 getMethods() 方法时将会依次获取权限为 public 的字段和变量,然后将包含从超类中继承到的成员实量和方法。而通过 getDeclareFields() 和 getDeclareMethod()只是获取在本类中定义的成员变量和方法。
3.通过反射访问的构造方法的使用
为了能够动态获取对象构造方法的信息,首先需要通过下列方法之一创建一个Constructor
类型的对象或者数组。
方法名 | 说明 |
---|---|
getConstructors() | 返回一个包含某些 Constructor 对象的数组,这些对象反映此 Class 对象所表示的类的所有公共构造方法 |
getConstructor(Class<?>…parameterTypes) | 返回一个 Constructor 对象,它反映此 Class 对象所表示的类的指定公共构造方法 |
getDeclaredConstructors() | 返回 Constructor 对象的一个数组,这些对象反映此 Class 对象表示的类声明的所有构造方法 |
getDeclaredConstructor(Class<?>...parameterTypes) | 返回一个 Constructor 对象,该对象反映此 Class 对象所表示的类或接口的指定构造方法 |
其中:参数的作用是指定列选,为需要反射获取的类的 类型的Class对象如:类型.class
Constructor类的常用方法:
方法名称 | 说明 |
---|---|
isVarArgs() | 查看该构造方法是否允许带可变数量的参数,如果允许,返回 true,否则返回false |
getParameterTypes() | 按照声明顺序以 Class 数组的形式获取该构造方法各个参数的类型 |
getExceptionTypes() | 以 Class 数组的形式获取该构造方法可能抛出的异常类型 |
newInstance(Object … initargs) | 通过该构造方法利用指定参数创建一个该类型的对象,如果未设置参数则表示采用默认无参的构造方法 |
setAccessiable(boolean flag) | 如果该构造方法的权限为 private,默认为不允许通过反射利用 netlnstance()方法创建对象。如果先执行该方法,并将入口参数设置为 true,则允许创建对象 |
getModifiers() | 获得可以解析出该构造方法所采用修饰符的整数 |
通过 java.lang.reflect.Modifier 类可以解析出 getMocMers() 方法的返回值所表示的修饰符信息。在该类中提供了一系列用来解析的静态方法,既可以查看是否被指定的修饰符修饰,还可以字符串的形式获得所有修饰符。
Modifier类的常用方法
静态方法名称 | 说明 |
---|---|
isStatic(int mod) | 如果使用 static 修饰符修饰则返回 true,否则返回 false |
isPublic(int mod) | 如果使用 public 修饰符修饰则返回 true,否则返回 false |
isProtected(int mod) | 如果使用 protected 修饰符修饰则返回 true,否则返回 false |
isPrivate(int mod) | 如果使用 private 修饰符修饰则返回 true,否则返回 false |
isFinal(int mod) | 如果使用 final 修饰符修饰则返回 true,否则返回 false |
toString(int mod) | 以字符串形式返回所有修饰符 |
4.通过反射访问的方法的使用
和Constructor类似:要动态获取一个对象方法的信息,首先需要通过下列方法之一创建一个 Method 类型的对象或者数组。
方法名 | 说明 |
---|---|
getMethod s() | 返回一个包含某些 Method 对象的数组,这些对象反映此 Class 对象所表示的类的所有公共方法 |
getMethod (Class<?>…parameterTypes) | 返回一个 Method 对象,它反映此 Class 对象所表示的类的指定公共方法 |
getDeclaredMethods() | 返回 Method 对象的一个数组,这些对象反映此 Class 对象表示的类声明的所有方法 |
getDeclaredMethod (Class<?>...parameterTypes) | 返回一个 Method 对象,该对象反映此 Class 对象所表示的类或接口的指定方法 |
Method类的常用方法:
静态方法名称 | 说明 |
---|---|
getName() | 获取该方法的名称 |
getParameterType() | 按照声明顺序以 Class 数组的形式返回该方法各个参数的类型 |
getRetumType() | 以 Class 对象的形式获得该方法的返回值类型 |
getExceptionTypes() | 以 Class 数组的形式获得该方法可能抛出的异常类型 |
invoke(Object obj,Object...args) | 利用 args 参数执行指定对象 obj 中的该方法,返回值为 Object 类型 |
isVarArgs() | 查看该方法是否允许带有可变数量的参数,如果允许返回 true,否 则返回 false |
getModifiers() | 获得可以解析出该方法所采用修饰符的整数 |
5.通过反射访问的方法的使用
和上面一样,通过下列任意一个方法访问成员变量时将返回 Field 类型的对象或数组。
方法名 | 说明 |
---|---|
Fields() | 返回一个包含某些 Field 对象的数组,这些对象反映此 Class 对象所表示的类的所有公共成员变量 |
getField (String name) | 返回一个 Field 对象,它反映此 Class 对象所表示的类的指定公共成员变量 |
getDeclaredFields() | 返回 Field 对象的一个数组,这些对象反映此 Class 对象表示的类声明的所有成员变量 |
getDeclaredField (String name) | 返回一个 Field 对象,该对象反映此 Class 对象所表示的类或接口的指定成员变量 |
Field类的常用方法:
方法名称 | 说明 |
---|---|
getName() | 获得该成员变量的名称 |
getType() | 获取表示该成员变量的 Class 对象 |
get(Object obj) |
获得指定对象 obj 中成员变量的值,返回值为 Object 类型 |
set(Object obj,Object value) |
将指定对象 obj 中成员变量的值设置为 value |
getlnt(0bject obj) | 获得指定对象 obj 中成员类型为 int 的成员变量的值 |
setlnt(0bject obj,int i) | 将指定对象 obj 中成员变量的值设置为 i |
setFloat(Object obj,float f) | 将指定对象 obj 中成员变量的值设置为 f |
getBoolean(Object obj) | 获得指定对象 obj 中成员类型为 boolean 的成员变量的值 |
setBoolean(Object obj,boolean b) | 将指定对象 obj 中成员变量的值设置为 b |
getFloat(Object obj) | 获得指定对象 obj 中成员类型为 float 的成员变量的值 |
setAccessible(boolean flag) | 此方法可以设置是否忽略权限直接访问 private 等私有权限的成员变量 |
getModifiers() | 获得可以解析出该方法所采用修饰符的整数 |