Java–反射机制原理、几种Class获取方式及应用场景

学习背景
 
学习Java的小伙伴,可能听过Java反射机制,但是熟悉又有点陌生,本文主要是通过思考面试中经常被问到的几个Java反射机制的问题,再通过理论知识结合代码实例及应用场景进行讲解,加深自己对Java反射机制的认知和理解,也希望能帮助到有需要的小伙伴——
 
一、Java反射机制是什么?
 
1.1 反射原理
 
(1)Java反射机制(Java Reflection)是Java语言中一种动态(运行时)访问、检测 & 修改它本身的能力,主要作用是动态(运行时)获取类的完整结构信息 & 调用对象的方法——
 
更简单点的说就是Java程序在运行时(动态)通过创建一个类的反射对象,再对类进行相关操作,比如:
 
获取该对象的成员变量 & 赋值
 
调用该对象的方法(含构造方法,有参/无参)
 
判断该对象所属的类
 
PS:不过说实话,直接看比较官方的定义还是有点难理解,再来更加通俗点的说吧——
 
(2)一般情况下,我们使用某个类,都会知道这个类,以及要用它来做什么,可以直接通过new实例化创建对象,然后使用这个对象对类进行操作,这个就属于正射——
 
(3)而反射则是一开始并不知道要初始化的是什么类,无法使用new来实例化创建对象,主要是通过JDK提供的反射API来实现,在运行时才知道要操作的是什么类,并且可以获取到类的完整构造以及调用对应的方法,这就是反射——
 
1.2 反射例子
 
代码如下:
 
package com.justin.java.lang;
 
import java.lang.reflect.Constructor;
 
import java.lang.reflect.Method;
 
/**
 
 * @program: Jdk1.8 Test
 
 * @description: 正射、反射简单调用示例
 
 * @author: JustinQin
 
 * @create: 2021/8/22 13:23
 
 * @version: v1.0.0
 
 **/
 
public class Student {
 
    private int id;
 
    public void setId(int id) {
 
        this.id = id;
 
    }
 
    public int getId() {
 
        return id;
 
    }
 
    public static void main(String[] args) throws Exception{
 
        //一、正射调用过程
 
        Student student = new Student();
 
        student.setId(1);
 
        System.out.println(”正射调用过程Student id:” + student.getId());
 
        //二、反射调用过程
 
        Class clz = Class.forName(”com.justin.java.lang.Student”);
 
        Constructor studentConstructor = clz.getConstructor();
 
        Object studentObj = studentConstructor.newInstance();
 
        Method setIdMethod = clz.getMethod(”setId”, int.class);
 
        setIdMethod.invoke(studentObj, 2);
 
        Method getIdMethod = clz.getMethod(”getId”);
 
        System.out.println(”正射调用过程Student id:” + getIdMethod.invoke(studentObj));
 
    }
 
}
 
输出结果:
 
正射调用过程Student id:1
 
反射调用过程Student id:2
 
上述例子反射的调用过程,可以看到获取一个类的反射对象,主要过程为:
 
获取类的Class实例对象
 
根据Class实例对象获取Constructor对象
 
再根据Constructor对象的newInstance方法获取到类的反射对象
 
获取到类的反射对象后,就可以对类进行操作了—— 例如,上述示例中对类的方法进行调用过程为:
 
根据Class实例对象获取到类的Method对象
 
再根据Method对象的invoke方法调用到具体类的方法
 
前面一点也提到了获取到类的Class实例对象,上面示例反向调用过程中我们是通过Class.forName(”类的全局定名”)这种方式来获取到类的Class实例对象,除了这种,常用的还有其他两种,往下讲解——

如需转载,请注明文章出处和来源网址:http://www.divcss5.com/html/h64927.shtml

张贴在3