反射

反射的概述

  在 Java 中的反射机制是指在运行状态中,对于任意一个类都能够知道这个类所有的属性和方法;并且对于任意一个对象,都能够调用它的任意一个方法;这种动态获取信息以及动态调用对象方法的功能称为 Java 语言的反射机制。

反射允许对封装类的字段、方法和构造函数的信息进行编程访问。

反射能干的事.png

反射机制的相关类在哪个包下?

java.lang.reflect.*;


演示用的 Person 类
package cn.test.reflect;

public class Person {
    private String name;
    private int age;
    public String gender;

    /**
     * 无参构造函数
     * 注意:当没有有参构造函数时,会隐式声明
     */
    public Person() {
    }

    public Person(String name) {
        this.name = name;
    }

    protected Person(int age) {
        this.age = age;
    }

    private Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public String eat(String name) {
        System.out.println("Eating!");
        return name + " - eating!";
    }

    public String getGender() {
        return gender;
    }

    public void setGender(String gender) {
        this.gender = gender;
    }

    @Override
    public String toString() {
        return "Name:" + this.name + "," + "Age:" + this.age + "," + "Gender:" + this.gender;
    }
}

获取 Class 对象的三种方式

① Class.forName("全类名")源代码阶段

Class clazz = Class.forName("cn.test.reflect.Person");

最为常用

② 类名.class加载阶段

Class clazz = Person.class;

一般更多的是当做参数进行传递

③ 对象.getClass()运行阶段

Person person = new Person();
Class clazz = person.getClass();

当我们已经有了这个类的对象时,才能使用

反射获取构造方法(Constructor)

Class 类中用于获取构造方法的方法:

方法说明
Constructor<?>[] getConstructors()返回所有 公共(public) 构造方法对象的数组
Constructor<?>[] getDeclaredConstructors()返回所有构造方法对象的数组
Constructor<T> getConstructor(Class<?>... parameterTypes)返回单个 公共(public) 构造方法对象
Constructor<T> getDeclaredConstructor(Class<?>... parameterTypes)返回单个构造方法对象

创建对象的方法:

① 通过 Class 类的 newInstance()方法
② 通过 Constructor 的 newInstance(Object[] args)方法

Constructor 类中其他几个常用方法:

方法说明
int getModifiers()返回构造函数的修饰符 ①
int getParameterCount()返回构造函数的参数数量
Parameter[] getParameters()返回构造函数参数数组(在类Executable中)
Class<?>[] getParameterTypes()返回构造函数参数类型数组(Class)②
Type[] getGenericParameterTypes()返回构造函数参数类型数组(Type)

① 返回的修饰符一般配合Modifier类的String toString(int mod)使用
② 结果集一般配合Class类的String getSimpleName()方法使用


示例代码:

展开查看

反射获取成员变量(Field)

Class 类中获取成员变量的方法:

方法说明
Field[] getFields()返回所有 公共 变量对象的数组
Field getField(String name)返回单个 公共 成员变量对象
Field[] getDeclaredFields()返回所有成员变量对象的数组
Field getDeclaredField(String name)返回单个成员变量对象

Field 类中其它几个常用方法:

方法说明
Class<?> getType()返回属性类型 ①
String getName()返回属性名名
int getModifiers()返回属性修饰符 ②
void set(Object obj, Object value)设置属性值
Object get(Object obj)读取属性值

① 一般配合Class类的String getSimpleName()方法使用
② 返回的修饰符一般配合Modifier类的String toString(int mod)使用


示例代码:

展开查看

反射获取成员方法(Method)

Class 类中获取成员变量的方法:

方法说明
Method[] getMethods()返回所有 公共 方法对象数组(包括继承的)
Method getMethod(String name, Class<?>... parameterTypes)返回单个 公共 方法对象
Method[] getDeclaredMethods()返回所有成员方法对象对象数组
Method getDeclaredMethod(String name, Class<?>... parameterTypes)返回单个成员方法对象

Method 类中其它几个常用方法:

方法说明
int getModifiers()返回方法的修饰符 ①
Class<?> getReturnType()返回方法的返回类型 ②
int getParameterCount()返回方法的形参数量
Class<?>[] getParameterTypes()返回方法的形参类型数组 ③
Parameter[] getParameters()返回方法的形参数组(在类Executable中)
String getName()返回方法名
Class<?>[] getExceptionTypes()返回异常类型列表
Object invoke(Object obj, Object... args)调用方法

① 返回的修饰符一般配合Modifier类的String toString(int mod)使用
② 一般配合Class类的String getSimpleName()方法使用
③ 结果集一般配合Class类的String getSimpleName()方法使用


示例代码:

展开查看

小结

反射的作用

① 获取任意一个类中的所有信息
② 结合配置文件动态创建对象

获取 class 字节码文件对象的三种方式

① Class.forName("全类名");
② 类名.class;
③ 对象.getClass();

如何获取构造方法、成员方法、成员变量

方法简记说明方法简记说明
get获取set设置
Constructor构造方法Parameter参数
Field成员变量Modifiers修饰符
Method方法Declared私有的