反射
1.什么是反射
反射允许对成员变量,成员方法和构造方法的信息进行编程访问。比如:IDEA的方法提示就是利用的反射。 反射获取到的这些信息不是从java文件中获取的,而是从class字节码中获取的。
2.获取class对象的三种方式
- Class.forName("全类名"); // 全类名就是 包名 + 类名
- 类名.class
- 对象.getClass();
使用说明:
- 在从java类加载为class字节码的源代码阶段可以使用第一种方法获取。
- 在从class字节码加载到内存中的时候可以用第二种方法获取。
- 在内存中创建该对象的运行阶段时可以用第三种方法获取。
示例:
java
package ReflectLearn;
public class ReflectTest {
public static void main(String[] args) throws ClassNotFoundException {
// Class.forName()方法
Class clazz1 = Class.forName("ReflectLearn.Student");
System.out.println(clazz1); // true
// 类名.class方法
Class clazz2 = Student.class;
System.out.println(clazz1 == clazz2); // true
// 对象.getClass()方法
Student student = new Student();
Class clazz3 = student.getClass();
System.out.println(clazz1 == clazz2); // true
System.out.println(clazz2 == clazz3); // true
}
}
3.获取构造方法、成员变量和成员方法
- 列用反射获取构造方法
java
Constructor<?>[] getConstructors() // 返回所有公共构造方法对象的数组
Constructor<?>[] getDeclaredConstructors() // 返回所有构造方法对象的数组
Constructor<T> getConstructor(Class<?> ...parameterTypes) // 返回单个公共构造方法的对象
Constructor<T> getDeclaredConstructor(Class<?> ...parameterTypes) // 返回单个构造方法的对象
/**
* Constructor类中用于创建对象的方法
*
*/
T newInstance(Object ...initargs) // 根据指定的构造方法创建对象
setAccessible(boolean flag) // 设置为true,表示取消访问检查, 暴力反射方法
4.获取字节码的成员变量
Class类中用于获取成员变量的方法:
java
Fiele[] getFields() // 返回所有公共成员变量对象的数组
Field[] getDeclaredFields() // 返回所有成员变量对象的数组
Field getField(String name) // 返回单个公共成员变量对象
Field getdDeclaredField(String name) // 返回单个成员变量对象
// Field类中用于创建对象的方法
void set(Object obj, Object value) // 赋值
Object get(Object obj) // 获取值
5.Class类中用于获取成员方法的方法
java
Method[] getMethods() // 返回所有公共成员方法对象的数组,包括继承的
Method[] getDeclaredMethods() // 返回所有成员方法对象的数组,不包括继承的
Method getMethod(String name, Class<?> ...parameterTypes) // 返回单个公共成员方法对象
Method getDeclaredMethod(String name, Class<?> ...parameterTypes) // 返回单个成员方法对象
// Method类中用于创建对象的方法
Object invoke(Object obj, Object ...args) // 运行方法
/**
* 参数一:用obj对象调用该方法
* 参数二、调用方法的传递的参数
* 返回值:方法的返回值