梁恒嘉的技术专栏 全栈之路

Java中的反射机制

2022-08-20
NanKe

记录JavaSE中的反射相关知识,程序运行期间,我们需要去使用类的属性或者方法,此时我们则需要使用反射机制,包括完整反射相关API使用,通过代码完整记录Java反射过程,动态获取类信息

前言

提示:本文要记录的大概内容

当我们需要去使用一个类中的属性或者方法的时候,我们通常是使用new关键字去调用类的构造方法创建出一个类的实例对象,然后通过这个实例对象去调用属性与方法

但是程序运行期间,我们需要去使用类的属性或者方法,此时我们则需要使用反射机制


提示:以下是本篇文章正文内容

一、反射是什么

反射机制是一种在程序运行期间动态获取某个类中相关属性与方法的机制

二、反射相关API

1.Class类

Class类的一个对象就表示一个正在运行中的Java类或者接口

一个类被加载到方法区之后,就会创建一个Class类对象,用来表示一个正在运行中的Java类或者接口

2.反射操作步骤

我们使用反射获取类信息的时候,通常分为如下几步:

  1. 获取到Class类
  2. 通过Class类获取到其对象
  3. 调用Class里面的获取方法,去动态获取类的属性或者方法

代码如下:

package reflect;

public class User {
    private Integer id;
    private String name;
    private String gender;

    public User() {
    }

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

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

    public String getGender() {
        return gender;
    }

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

    @Override
    public String toString() {
        return "User{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", gender='" + gender + '\'' +
                '}';
    }
}
package reflect;

import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

public class ReflectDemo {
    public static void main(String[] args) throws ClassNotFoundException, IllegalAccessException, InstantiationException, NoSuchMethodException, InvocationTargetException {
        User user = new User();
        user.setId(1);
        user.setName("Simon");
        user.setGender("男");
        //        1:首先获取到Class类
        Class aClass = user.getClass();
        //        2:创建Class的对象
        Object instance = aClass.newInstance();
        //        3:获取构造方法
        Constructor constructor = aClass.getConstructor();

        Field[] fields = aClass.getDeclaredFields();
        for (Field field : fields) {
            Method method = aClass.getMethod("get" + String.valueOf(field.getName().charAt(0)).toUpperCase() + field.getName().substring(1));
            System.out.println(method.invoke(user));
        }
    }
}

运行结果如图所示:

在这里插入图片描述

总结

反射机制里面的getDeclaredFields()方法可以获取到所有的类属性。一般方法名称带有Declared字段都可以获取到类的所有信息。如若不带Declared字段,有时候可能会获取不到私有的属性或者方法。我们需要获取类里面的方法的时候,可以通过拼接类的方法名称后调用getMethod()方法去获取到方法,最后调用invoke()得到方法的执行结果


 

Content