Skip to content

反射

1.什么是反射

反射允许对成员变量,成员方法和构造方法的信息进行编程访问。比如:IDEA的方法提示就是利用的反射。 反射获取到的这些信息不是从java文件中获取的,而是从class字节码中获取的。

2.获取class对象的三种方式

  1. Class.forName("全类名"); // 全类名就是 包名 + 类名
  2. 类名.class
  3. 对象.getClass();

使用说明:

  1. 在从java类加载为class字节码的源代码阶段可以使用第一种方法获取。
  2. 在从class字节码加载到内存中的时候可以用第二种方法获取。
  3. 在内存中创建该对象的运行阶段时可以用第三种方法获取。

示例:

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.获取构造方法、成员变量和成员方法

  1. 列用反射获取构造方法
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对象调用该方法
 * 参数二、调用方法的传递的参数
 * 返回值:方法的返回值

Released under the MIT License.