深入理解反射

315 阅读2分钟

一.反射概述

1.什么是反射

Java反射就是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性;并且能改变它的属性

通俗来讲就是以一个事物的核心部分或者说是其最有代表性的一部分,通过以小见大,从内在本质出发获取到它的各个方面的外在属性。就好比警察断案时,能将犯人的一个指纹进行匹对,找到他这个个体,进而获得他的身份(姓名,年龄),以及兴趣爱好等,java将这种方式视为动态。

提到动态,就不得不说动态代理与静态代理,在Java框架中像Spring5中的AOP,jdbcTemplate,Dubbo的SPI接口,便都是基于java动态代理实现的。

2.反射的机制

1.了解反射机制之前我们有必要知道何为JVM,何为Class文件。

jvm像是一个大的内存容器,将类中的数据统筹分配,分为JVM栈堆内存方法区,本地方法栈,程序计数器。其中堆内存用来存放对象(地址)和数组。栈中只保存基础数据类型的对象和自定义对象的引用(就是对象名称)。在方法区中,存储了每个类的信息(包括类的名称、方法信息、字段信息)、静态变量、常量以及编译器编译后的代码等。

Class文件就是java文件编译后生成的字节码文件。class文件的指令便是在jvm中执行的。

2.一张图了解反射机制

image.png

二.代码展现

通过创建相应class文件的对象,去获取对应类的属性和方法

//通过反射技术给object对象的property属性赋propertyValue值
private void setValue(Object obj, String 
        property, Object propertyValue) {
    //获取字节码文件
    Class clazz = obj.getClass();
    try {
        //获取property这个字符串对应的属性名 , 比如 property"fid"就会去找 obj对象中的 fid 属性
        Field field = clazz.getDeclaredField(property);
        if (field != null) {
            field.setAccessible(true);
            field.set(obj, propertyValue);
        }
    } catch (NoSuchFieldException | IllegalAccessException e) {
        e.printStackTrace();
    }
}

通过创建相应class文件的对象,去获取对应类的方法名以及方法参数

//获取controllerBeanObj类里所有的方法并返回一个method的数组
Method[] methods = controllerBeanObj.getClass().getDeclaredMethods();
for (Method method : methods) {
    //method.getName()获取方法名
    if (operate.equals(method.getName())) {
        
        //获取当前方法的参数,返回参数数组
        Parameter[] parameters = method.getParameters();

三.反射API

反射的api我已经在写另一篇文章里了,具体请参考Java反射常用API - 掘金 (juejin.cn)